翻一翻祖传仓库的 git log --oneline,总能看到这样的提交:“修复bug”、“一些修改”、“final 最终版”、“update 1111”。三个月后回头排查问题时,这些记录约等于没有。Conventional Commits(约定式提交)就是解这个问题的。
基本格式
<type>(<scope>): <subject>
[可选的正文]
[可选的脚注]
一行看懂的例子:
feat(order): 订单列表支持仅看未读
fix(auth): 修复 token 过期后未跳转登录页的问题
docs: 补充本地开发环境搭建说明
常用 type
- feat:新功能(会触发 minor 版本号);
- fix:缺陷修复(会触发 patch 版本号);
- docs / style / refactor / perf / test / chore:文档、格式、重构、性能、测试、杂项,均不改变业务语义;
- BREAKING CHANGE:在脚注声明或 subject 后加
!,破坏性变更(触发 major)。
两条容易被忽略的规则
一是 subject 用祈使句、不加句号:写 “add cache” 而不是 “added cache”,保持和 git 官方建议一致,翻阅时整齐得多。二是 一个提交只做一件事:格式化整个文件和修改逻辑分开提交,否则 blame 的时候全是无意义的格式 diff,代码考古直接失明。
用工具兜底
规范靠自觉是不长久的,加一层提交校验即可。commitlint + husky 的最小配置:
// commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'subject-max-length': [2, 'always', 50],
},
};
# package.json
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
再配合 conventional-changelog 工具,可以直接从提交历史生成 CHANGELOG。花在写提交信息上的十秒钟,是三个月后的自己最划算的投资。