讲解
git commit 把暂存区的内容固化成一个提交(commit):一次历史的快照。每个提交有一个唯一的哈希 ID(如 3f2a1b9)、作者、时间和一条提交信息,并且指向它的父提交——提交之间靠这种指向串成一条链,这就是「历史」。提交是 Git 里最重要的动作,也是安全的动作:只要提交了,改动就进了仓库,几乎总能找回来。
提交信息(message)值得认真对待。通行规范是第一行用不超过 50 字的祈使句概括「做了什么」,需要时空一行再写正文解释「为什么」。很多团队采用 Conventional Commits 约定:类型前缀加描述,如 feat: 新增用户搜索(新功能)、fix: 修复登录超时(修 bug)、docs:、chore:、refactor:、test: 等。清晰的提交信息让 git log 变成一份可读的项目编年史,代码评审和问题追溯都靠它。切忌 fix、update、改bug 这类等于没写的信息。
常用选项:git commit -m "信息" 直接给信息(不加 -m 会打开编辑器);git commit -am "信息" 先把所有已跟踪文件的修改暂存再提交,省去 add 一步(新文件不适用);git commit --amend 修改最近一次提交——可以改信息,也可以把漏掉的文件补进去。注意 amend 会生成新哈希替换旧提交,已经推送(push)出去的提交不要再 amend,否则会和别人的历史分叉。
示例
echo "v2" >> app.js
git add app.js
git commit -m "feat: app 升级到 v2"
git status
echo "v3" >> app.js
git commit -am "feat: app 升级到 v3"
git log --oneline -3
echo "补充一句说明" >> docs.txt
git add docs.txt
git commit -qm "docs: 补充说明档"
git commit --amend -m "docs: 补充说明文档"
git log --oneline -1
最后一次提交的信息从「补充说明档」被 amend 修正为「补充说明文档」。amend 只改最近一个提交,更早的提交信息要用交互式 rebase(后面的章节会讲)。
常见坑
- 把一堆不相关改动塞进一个提交:「改登录 + 修样式 + 更新文档」一个提交,出了问题想单独回退某部分就做不到。一个提交只做一件事。
- 提交信息敷衍:三个月后的自己就是别人。fix bug 这样的信息在排查历史时毫无帮助。
- 对空暂存区 commit:没有任何暂存改动时 commit 会被拒绝(nothing to commit)。先 status 看看是不是忘了 add。
- amend 已推送的提交:改写已公开的历史会让协作者拉取时产生冲突。原则:只修改还没离开自己电脑的提交。
小结
commit 把暂存区固化成历史快照,信息第一行说清「做什么」;推荐 Conventional Commits 前缀;-am 跳过 add,--amend 修正最近一次提交(仅限未推送的)。下一节学习查看历史和对比差异。