Best Practices
提交信息规范约定
统一提交信息结构(动词、范围、原因)提升日志可读性、问题追踪效率和跨团队协作透明度。
- 希望把 Git 用得更稳的个人或团队
- 准备建立协作规范的维护者
- 至少有一次真实协作经验
- 知道常见命令但还没形成稳定习惯
- 把建议当硬规则而忽略上下文
- 只记流程,不理解背后的协作边界
引用与延伸阅读
- Git commit [博客]
- Git commit [官方]
- www.conventionalcommits.org — V1.0.0 [博客]
学完这篇你会掌握什么
- 掌握 Conventional Commits 的
<type>(<scope>): <summary>结构与正文该写什么 - 理解为什么好的提交信息能让
git bisect、git log、CHANGELOG 真正可用 - 识别常见的提交信息误区,并知道在代码评审中怎么纠偏
高质量提交信息不是形式主义,它直接影响回溯效率和发布可读性。
先想一个问题
生产事故后你想回溯是哪个 commit 引入了问题,可历史里全是 fix bug、update 这种 message。git bisect 最后停在一条 commit 上,你却看不出它改了什么——定位根因花的时间比本该有的长得多。问题不是你不会用 Git,而是历史本身不可读。
一个可落地的模板
<type>(<scope>): <summary>
正文建议补两点:
- 为什么改
- 有哪些风险或后续动作
确定变更范围选择类型前缀编写清晰描述
可读历史自动分类可生成文档
好的 message 不是写给自己看的,而是写给半年后的自己和同事看的。
示例
fix(auth): reject expired refresh token
Align backend token validation with new TTL rule.
Risk: may increase login retries for stale clients.
团队约定建议
- summary 用动词开头,尽量在 72 字符内
- 把“原因”写清,不只写“改了什么”
- 破坏性变更必须显式标注
PR 页面会被折叠或丢失上下文,commit 日志才是长期可检索的历史索引。
常见误区
- “message 写给自己看就行” —— 恰恰相反。半年后的你和同事都靠
git log与git bisect回溯,模糊的 message 会让定位成本翻倍。 - “一个 commit 顺手塞多个不相关改动” —— 例如同时改了登录逻辑和文档错别字。这样
git revert/git bisect无法只回退其中一部分,二分排查会失真。 - “已推送的 commit 用
--amend改” —— 改写共享历史会让协作者pull时冲突。只改本地、未推送的 commit 才用 amend;已推送的用新 commit 修正。 - “summary 写成
fix: 修bug” —— 没有 scope、没有原因。规范做法是fix(auth): reject expired refresh token,让人一眼知道影响面。
git commit --amend 会生成一个新的 commit 对象并替换当前 HEAD;已推送到远程的 commit 被改写后,他人历史会出现分叉,需要强制推送且影响所有人。
一次真实事故回溯
# 线上登录失败,需要定位引入问题的 commit
$ git log --oneline -10
a1b2c3d update # 无法判断改了什么
e4f5g6h fix bug # 同样没有信息
$ git bisect start <bad> <good>
# 二分最后停在 "update" 上,但 message 看不出它破坏了 token 校验
如果当初写成 fix(auth): reject expired refresh token,事故定位能直接命中,省下大量排查时间。
接下来建议继续看什么
给你的练习
- 把你最近一个项目的 5 条历史 commit 改成 Conventional Commits 格式(
type(scope): summary+ 正文写原因),对比改写前后git log --oneline的可读性。 - 故意把一个“修登录”和一个“改文档错别字”的改动分两次提交,然后用
git bisect模拟定位,体会单关注点 commit 的优势。 - 在团队里评审一条
fix: 修bug类的 message,按本文模板给出改写建议,并说明为什么 scope 和原因缺一不可。
延伸阅读
沿着同一主题继续深入: