写出优秀的 Git 提交信息:一份详尽指南(Angular 风格)
在现代软件开发中,良好的 Git 提交信息不仅有助于项目协作、问题追踪和历史回溯,更是保障项目可维护性的重要一环。本文将基于 AngularJS 团队广泛使用的 Git 提交信息规范,手把手教你如何写出专业、统一、可读性强的 commit message。
✨ 为什么要遵守 Git 提交规范?
遵守统一的提交规范可以带来以下好处:
- ✅ 自动生成清晰的 CHANGELOG.md
- ✅ 在使用
git bisect
调试时可跳过不相关提交 - ✅ 浏览历史时一目了然,快速定位变更位置与内容
- ✅ 增强协作与团队沟通效率
- ✅ 为代码审查、回滚、统计等操作提供结构化支持
🧱 提交信息的结构
标准的 Git 提交信息应遵循以下格式:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
⚠️ 每一行 建议不超过 100 个字符,以便在 Git 工具或 GitHub 等平台中更好地展示。
1️⃣ Header(头部)
格式如下:
<type>(<scope>): <subject>
type
:说明 commit 的类型(详见下文)scope
:可选,说明 commit 影响的范围(如模块、组件等)subject
:简洁明了地描述本次修改内容(动词开头、小写、无句号)
📌 示例:
feat(router): add lazy-loading support
fix(login): prevent crash on invalid credentials
docs(api): update user guide for v2 endpoints
2️⃣ Type(类型)
下面是推荐的类型(type)及其用途说明:
Type | 用途 |
---|---|
feat | 新功能 |
fix | 修复 Bug |
docs | 文档变更 |
style | 格式修改(不影响逻辑,例如空格、分号等) |
refactor | 代码重构(不是新功能,也不是 Bug 修复) |
test | 增加测试或修改现有测试 |
chore | 构建流程、工具等杂项维护 |
revert | 回滚某次提交 |
3️⃣ Scope(范围)
scope
是对变更影响模块的说明,例如:
- 模块名:
$http
,$compile
,auth
,router
- 文件或功能名:
ngClick
,form
,login-page
没有明确 scope 时,可以使用 *
代替:
chore(*): update all dependencies
4️⃣ Subject(主题)
这是 commit 的简要描述:
- 使用动词原形,如:“add”、“fix”、“refactor”
- 使用现在时态:如 “change”,而非 “changed”
- 不以大写字母开头,不以句号结尾
✅ 正确示例:
add support for dark mode
❌ 错误示例:
Added support for dark mode.
5️⃣ Body(正文)
正文用于说明提交的 动机、前后行为对比 或 技术细节。规范要求:
- 使用 现在时、命令式语气
- 分段描述,避免堆砌句子
📌 示例:
Old behavior did not support lazy loading,
which caused bundle size to be large on initial load.This commit introduces a dynamic import-based strategy
to only load modules when needed.
6️⃣ Footer(页脚)
页脚用于列出:
🔥 Breaking Changes(破坏性变更)
使用 BREAKING CHANGE:
开头,说明该变更会破坏兼容性,并附上迁移建议:
BREAKING CHANGE: remove deprecated `authToken` paramUse `accessToken` instead and update middleware config accordingly.
🐛 关联 Issues
通过 Closes #123
形式自动关闭对应 Issue:
Closes #123, #456
🔁 Revert(回滚提交)
如果需要撤销某次提交,格式如下:
revert: feat(router): add lazy-loading supportThis reverts commit e7a8db27f2d8deac3c8e2731ffb33f.
📜 使用范例大全
以下是一些完整的 commit message 示例,供参考:
feat($browser): onUrlChange event (popstate/hashchange/polling)Added new event to $browser:
- forward popstate event if available
- fallback to hashchange
- finally use polling if no event is supportedBREAKING CHANGE: removed $browser.onHashChange
Closes #128
fix($compile): fix HTML serialization in IE9Older IE versions serialize HTML in uppercase, but IE9 does not.
Case-insensitive comparison is required, but jasmine lacks support.Closes #392
docs(guide): fix typos in directive guide- correct batchLogbatchLog -> batchLog
- fix indentation and braces
💡 实用技巧与命令推荐
🔍 查看历史提交摘要(Subject):
git log <last-tag> HEAD --pretty=format:"%s"
🔎 仅筛选新增功能提交:
git log <last-tag> HEAD --grep feat
🚫 忽略无意义提交(如格式调整):
git bisect skip $(git rev-list --grep irrelevant <good-commit> HEAD)
✅ 总结
一个优秀的提交信息应当是:
- 格式统一
- 信息清晰
- 语义明确
- 可自动化处理(如生成 changelog)
如果你想让你的团队协作更顺畅,让开源项目更专业,从写好每一个 commit message 开始吧!
🔗 参考资料
- AngularJS Git Commit Guidelines
- How to Write a Git Commit Message – Chris Beams
- A Note About Git Commit Messages – tBaggery