暂存区与文件操作
Git 的一次提交不是直接把所有改动写入历史,而是先把想提交的内容放进暂存区。暂存区可以理解为“下一次 commit 的候选清单”。
git add <file>
git add -- README.md用途:把指定文件的新内容加入暂存区。它既可以添加新文件,也可以暂存已跟踪文件的修改。
适用场景:
- 只想提交某一个文件,而不是提交全部改动。
- 想把一次工作拆成多次提交,每次只暂存相关文件。
示例:
git add README.md
git add src/app.py检查:
git status
git diff --stagedgit add .
git add .用途:把路径规则 . 覆盖范围内的新增、修改和删除加入暂存区;. 表示当前目录及其子目录,而不一定是整个仓库。
适用场景:
- 已经确认当前工作区只有本次要提交的改动。
- 小型项目或一次性整理时,需要快速暂存全部变更。
注意点:
- 执行前建议先跑
git status,避免把临时文件、日志、生成产物一起提交。 - 当前 Git 的
git add <pathspec>会记录所给路径范围内的新增、修改和删除;非常旧的 Git 行为不同。若明确要覆盖整个仓库,可先回到仓库根并审查状态,再使用git add -A。
git add -p
git add -p用途:交互式选择文件中的部分改动加入暂存区。Git 会把改动分成多个 hunk,让你逐段选择是否暂存。
适用场景:
- 一个文件里混有多个逻辑改动,但你只想提交其中一部分。
- 提交前想更精确地控制 commit 范围。
常见交互含义:
y:暂存当前 hunk。n:跳过当前 hunk。s:继续拆分当前 hunk。q:退出交互。
建议:用 git diff --staged 复查最终暂存内容,避免漏选或误选。
git mv <old> <new>
git mv old-name.md new-name.md用途:移动或重命名文件,并把旧路径删除与新路径加入暂存区。提交仍保存前后快照,rename 是比较历史时依据相似度推断的结果。
适用场景:
- 重命名源码文件、文档或目录内文件。
- 希望一次命令完成“移动文件 + 暂存路径变化”。
示例:
git mv old-name.md new-name.md说明:git mv 本质上完成文件移动并暂存路径变化;Git 不保存一条永久“重命名记录”,显示历史时会根据内容相似度判断重命名。手工移动后再执行 git add -A 也可以被识别。
git rm <file>
git rm -- obsolete.md用途:从工作区删除文件,并把删除动作加入暂存区。
适用场景:
- 文件确实不再需要,且希望下一次提交记录这次删除。
注意点:
- 这会删除本地文件。若只是想让 Git 停止跟踪,但保留本地文件,应使用
git rm --cached <file>。
git rm --cached <file>
git rm --cached -- .env用途:让 Git 停止跟踪某个文件,但不删除本地文件。
适用场景:
- 某个本地配置、缓存或生成文件已经被误提交过,现在想从版本管理中移除。
- 准备把文件加入
.gitignore,但本地仍要保留它。
常见组合:
git rm --cached .env
Add-Content .gitignore ".env"
git status注意:如果敏感信息已经进入历史,仅从最新提交中移除并不能清除历史泄漏,需要进一步清理 Git 历史并轮换凭据。
git reset <file>
git reset -- README.md用途:把指定文件从暂存区移出,但保留工作区里的实际修改。
适用场景:
git add后发现某个文件不该放进下一次提交。- 想重新拆分提交范围。
现代替代写法:
git restore --staged -- README.mdgit reset
git reset用途:取消全部暂存内容,但保留工作区修改。
适用场景:
- 一次性撤销
git add .的结果。 - 重新整理下一次提交的文件范围。
注意:不带 --hard 的 git reset 通常不会删除工作区文件;真正危险的是 git reset --hard,见 撤销与清理。
git status
git status用途:查看工作区和暂存区状态。它会告诉你哪些文件未跟踪、哪些文件已修改、哪些文件已经暂存。
使用习惯:
- 提交前先看一次。
- 执行撤销、移动、删除命令后再看一次。
- 看到不确定的文件时,不要直接
git add .。
简洁输出:
git status --short最小练习
在隔离实验仓库中修改 README.md,依次运行 git add -- README.md、git diff --staged、git restore --staged -- README.md。用自己的话说明:文件内容是否改变、暂存区是否改变、历史是否改变。