commit message 不能只写“merge”或“fix”,因为它必须说明“为什么合、合了什么关键改动、是否上线/灰度/回滚”;angular规范要求第一行是“类型+作用域+简短描述”,空一行后接正文,确保人机可读、支持自动化生成changelog。

Commit Message 为什么不能只写“merge”或“fix”
因为 Git 的 git merge 默认生成的合并提交(merge commit)如果没改 message,就会是类似 Merge branch 'feature/login' 这种——它只告诉你“谁合进了谁”,不说明“为什么合”“合了什么关键改动”“是否上线/灰度/回滚”。团队协作中,后续查问题、做发布评审、写 release note 都会卡在这一步。
怎么写一条能被机器和人都读懂的 Commit Message
用 Angular 规范(目前最通用的工程化实践)就够了:第一行是「类型+作用域+简短描述」,空一行后接正文。不是为了凑格式,而是为了让 git log --oneline 一眼看出变更意图,也让 conventional-changelog 等工具能自动生成 changelog。
-
feat(auth): add OAuth2 fallback for SSO timeout—— 新功能,影响 auth 模块,解决超时场景 -
fix(api): avoid 500 when user_id is nil in /v1/profile—— 修复 API 层空值 crash -
chore(deps): upgrade axios from 1.4.0 to 1.6.7—— 依赖升级,非业务逻辑变更
注意:类型(feat、fix、docs、chore 等)必须小写;作用域(如 auth、api)用小写短名,别写成 user-authentication-module;第一行控制在 50 字以内,不要句号结尾。
合并时怎么避免默认 message,直接填自定义内容
Git 默认 git merge 会弹出编辑器让你改 message,但很多人直接 :wq 保存了默认内容。更稳的方式是用 --no-edit + -m 组合,或提前准备模板:
- 手动合并时:
git merge --no-edit -m "feat(payment): support Alipay refund webhook v2" - 如果用了
git pull --rebase,那 commit 是线性提交,message 就是你原 commit 的,不用额外处理 - CI/CD 流水线里自动合并(如 GitHub Actions),建议在 PR 描述里强制要求填写「Release Note」字段,并用脚本提取生成 message,而不是靠
git merge自动生成
别依赖 git commit --amend 补救——合并提交一旦 push,修改 message 就得 force push,容易打断别人本地分支。
哪些情况要特别小心 message 写法
三类高风险合并最容易写错 message:
- 从
release/v2.3向main合 hotfix:message 必须带hotfix类型,例如hotfix(api): prevent SQL injection in search query,方便后续 cherry-pick 或打 patch 版本 - 多分支同时合并(比如两个 feature 同时合进 develop):不要写成
Merge branch 'feat/a' and 'feat/b',而要按实际交付价值合并描述,比如feat(search): unify filter logic across mobile & desktop - Rebase 后的 squash merge:GitHub/GitLab UI 上点 “Squash and merge” 时,它会把所有 commit message 拼起来当默认内容——这时务必手动删掉冗余行,只留一句准确的总结,否则 message 会变成 “fix typo… add test… refactor… fix again…”
真正难的不是格式,是合并前想清楚:这次合入到底解决了哪个用户问题、绕过了哪个线上限制、或者为哪次发布铺了路。message 是给三个月后的自己看的,不是给 Git 看的。











