Command Reference

git commit 教程

解释 git commit 如何生成新的历史节点、怎样写出更有价值的提交信息,以及 amend 适合和不适合的边界。

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

一句话理解

git commit 会把暂存区中的快照固定成一个新的提交对象,并把当前分支移动到这个新的历史节点上。

提交不仅是内容,也是解释

一个好的 commit 不只是“把代码存下来”,而是提供一个清晰检查点,并告诉后来的人为什么这里值得成为一个检查点。

它真正解决的是什么问题

很多人把 commit 当成保存按钮。
这个理解太弱了。

一个高质量提交至少同时提供:

  • 可回退的检查点
  • 可评审的最小变更单元
  • 可 cherry-pick、可回滚的历史颗粒度
  • 让团队看懂演进过程的文字说明

所以问题从来不是“有没有提交”,而是“这个提交是否值得存在”。

常见用法

git commit -m "feat: add search dialog"
git commit --amend
  • git commit -m:把当前 staged 内容写成一个新提交
  • git commit --amend:重写最近一次本地提交

提交前应该先确认什么

执行前先问自己三个问题:

  1. 暂存区是不是只包含一个逻辑主题?
  2. 提交信息是不是解释了意图,而不只是描述“改了文件”?
  3. 这段历史还只在本地,还是已经被别人看到?

第三个问题很关键,因为:

  • 本地历史可重写,成本通常不高
  • 已共享历史再改写,就会变成协作问题

提交信息怎样更有价值

更好的提交信息通常具备这些特点:

  • 具体
  • 动词导向
  • 与 diff 范围一致

例如:

  • 更好:fix: avoid infinite loading in doc search
  • 较弱:update search
  • 更弱:misc changes

很多时候,提交信息写不好,并不是因为你不会写句子,而是这次提交本身就过于混杂。

amend 什么时候适合用

git commit --amend 很适合这些情况:

  • 刚提交完,发现漏加了一个小文件
  • 提交信息写得太模糊
  • 想在发起评审前把最近一次提交整理得更干净

它不太适合这些情况:

  • 这次提交已经 push 到共享分支
  • CI、评审评论或同事已经建立在这段历史上
把 amend 当成本地整理工具

如果历史还没有共享,amend 是清理最近一次提交最省噪音的方式之一。

一套更稳的提交流程

更推荐这样做:

  1. git status 看状态
  2. git diff --staged 看这次提交真正会包含什么
  3. 写一个说明意图的消息
  4. 提交后用 git log --oneline -5 看最近历史是否清晰

例如:

git status
git diff --staged
git commit -m "fix: fall back to local search index on timeout"
git log --oneline -5

图例理解

把 staged 状态写进历史commit 并不是直接从当前文件读取全部内容,而是把 index 里的快照写成新历史节点,并移动当前分支。
输入
工作区改动暂存区快照当前分支
结果
新提交对象移动后的分支指针可恢复检查点
如果提交结果不对,优先检查 index 是否已经从一开始就错了。

边界与常见错误

  • git commit 不会自动包含所有可见文件改动,它只记录 staged 的内容。
  • 一个提交里混了重构、修 bug、格式化,后续 review 和 revert 都会更痛苦。
  • 本地重写历史通常是低成本整理;已发布历史再改,是协作层面的决定。
不要把 commit 当成杂物盒

如果一条提交信息怎么写都显得模糊,通常不是文字问题,而是这次提交的边界本来就不清楚。

跟着做一遍

练习:比较混乱提交和干净提交

目标是感受 staging 和 commit message 一起作用时,历史质量为什么会明显更高。

准备
git switch -c lab/commit-demo
# 同时做一个真正修复和一个无关清理
动手试
  1. 先想象把所有改动一次性提交会得到什么 message。
  2. 然后清空 index,只暂存真正修复的部分。
  3. 创建一条聚焦提交。
  4. 再把清理部分单独提交,写第二条更准确的 message。
会发生什么
  • 你可以直观看到“一个混乱提交”和“两条清晰提交”的差别。
  • 分离后的历史更容易 review。
  • 以后要 revert 或 cherry-pick 时,成本也会更低。
常见错误判断
  • 如果已经 push,再 amend 前先确认分支是否共享。
  • 如果 message 很泛,先怀疑 staged diff 是否太大。
  • 如果不确定这次 commit 会写入什么,先看 `git diff --staged`。