Command Reference

git add 教程

说明 git add 如何把工作区改动加入暂存区、如何用 patch 精细暂存,以及怎样避免把不相关改动混进同一次提交。

适合谁看
  • 已经会基本提交和分支操作的开发者
  • 想理解命令边界与风险的人
前置知识
  • 知道工作区、暂存区、提交的基本关系
  • 能读懂 `git status` 和简单历史图
常见风险
  • 误把本地整理命令用到共享历史
  • 在没确认恢复路径前直接继续改写历史

一句话理解

git add 会把工作区里选中的内容复制进暂存区,让下一次提交只使用这份暂存快照。

先理解三层模型

git add 不是“保存文件”,而是更新 index。也正因为如此,同一个文件可以同时存在“已暂存的部分”和“还没暂存的部分”。

它真正解决的是什么问题

Git 不是“改完文件直接提交”。
它要求你先回答一个问题:

这次提交到底要讲哪一个完整而清晰的故事?

git add 就是为这个问题服务的。
它让你可以:

  • 把一次混乱的开发过程拆成几个逻辑提交
  • 只暂存已经准备好评审的代码
  • 暂时把试验性改动留在工作区里
  • 在冲突解决后,只把真正解决完的文件标记进下一步

最常用的几种写法

git add README.md
git add src/
git add .
git add --patch
  • git add README.md:暂存单个文件
  • git add src/:暂存某个目录
  • git add .:暂存当前目录下发现的所有改动
  • git add --patch:按 hunk 交互式选择要不要暂存

一套更稳的日常流程

实际协作里,更推荐这样做:

  1. 先用 git status 看当前状态
  2. 再用 git diff 看工作区里到底改了什么
  3. git add <path>git add --patch 精确暂存
  4. git diff --staged 检查这次提交真正会包含什么
  5. 确认无误后再 commit

例如:

git status
git diff
git add --patch
git diff --staged
git commit -m "fix: keep search fallback stable"
把 index 当成质量过滤器

如果一次提交应该只表达一个意图,那么 index 就是你在进入历史之前做最后筛选的地方。

最常见的误区

很多问题并不是命令不会用,而是暂存太随意。

典型错误包括:

  • git add . 把调试代码、格式化和真正修复一起带进去
  • 以为一个文件“已经 add 过”就代表后续新增的改动也会自动进入提交
  • 解决完冲突后忘记重新 add 标记已解决状态
  • 明明需要拆小提交,却仍然整文件整目录地暂存

为什么 --patch 很重要

git add --patch

它之所以关键,是因为它让你可以把这些东西拆开:

  • 真正的 bug fix 和顺手做的重构
  • 生产代码改动和临时日志
  • 已经确定的修改和还在犹豫的实验

这往往决定了你的提交会是:

  • 易于 review、易于 cherry-pick、易于 revert 的清晰提交
  • 还是“改了很多但说不清到底改了什么”的混乱提交

如何理解“同一个文件同时有已暂存和未暂存内容”

设想你对一个文件做了两轮修改:

  1. 第一轮是真正的逻辑修复
  2. 第二轮是临时加的调试输出
  3. 然后你用 git add --patch 只暂存第一轮

这时 Git 的状态就是:

  • 暂存区里只有逻辑修复
  • 工作区里还保留着调试输出

这不是 Git 在“搞复杂”,而是它给了你比“整文件提交”更高的表达能力。

图例理解

工作区到暂存区再到提交真正要分清的是:你现在是在改文件、在整理暂存快照,还是在把暂存快照写进历史。
当前状态
工作区改动暂存区快照当前分支
可能结果
更新后的 index更干净的 staged diff更安全的下一次提交
如果不知道这次 add 到底带进来了什么,先看 `git diff --staged` 再继续。

边界与判断

  • git add 通常不会移动分支指针,但它会直接改变“下一次提交意味着什么”。
  • git add . 很快,但不够谨慎。只要改动混杂,就更适合按路径或按 patch 暂存。
  • 在切分支、做恢复、准备 rebase 之前,清楚区分 staged 和 unstaged 非常重要。
不要把暂存误当成备份

暂存区只是本地状态的一部分,不是独立备份点。如果你需要可靠恢复点,应该 commit 或 stash,而不是以为“已经 add 过了就安全”。

跟着做一遍

练习:把一段混乱修改整理成干净提交

目标不是背命令,而是感受到工作区和暂存区的差别。

准备
git switch -c lab/add-demo
# 在一个文件里同时写入真正修复和临时调试输出
动手试
  1. 先运行 `git diff` 看全部改动。
  2. 运行 `git add --patch`,只暂存真正修复的部分。
  3. 运行 `git diff --staged`,确认 staged 内容已经干净。
  4. 保留调试输出在工作区里,单独完成这次提交。
会发生什么
  • 提交里只会包含你暂存的那部分改动。
  • 工作区仍然可以保留没准备好的修改。
  • 你会得到更干净、更容易 review 的历史。
常见错误判断
  • 如果 `git diff` 没输出,检查改动是不是已经进了 staged。
  • 如果提交里还是混入了不相关内容,通常是暂存范围太宽。
  • 如果刚解决完冲突,记得真正结束冲突流程前要重新 `git add`。