暂存区与文件操作

Git 的一次提交不是直接把所有改动写入历史,而是先把想提交的内容放进暂存区。暂存区可以理解为“下一次 commit 的候选清单”。

git add <file>

git add -- README.md

用途:把指定文件的新内容加入暂存区。它既可以添加新文件,也可以暂存已跟踪文件的修改。

适用场景:

  • 只想提交某一个文件,而不是提交全部改动。
  • 想把一次工作拆成多次提交,每次只暂存相关文件。

示例:

git add README.md
git add src/app.py

检查:

git status
git diff --staged

git 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.md

git 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。用自己的话说明:文件内容是否改变、暂存区是否改变、历史是否改变。