近期在项目过程中,对git commit进行了规范化,参考了几篇文章之后,小小的总结一下
一、规范的commit信息
目前规范使用较多的是 Angular 团队的规范, 继而衍生了 Conventional Commits specification. 很多工具也是基于此规范, 它的 message 格式如下:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
主要分为3个部分:
- 标题行: 必填, 描述主要修改类型和内容
- 主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等
- 页脚注释: 放 Breaking Changes 或 Closed Issues
1.1 type
type用于说明 commit 的提交性质
| 值 | 说明 |
|---|---|
| feat | 新增一个功能 |
| fix | 修复一个bug |
| docs | 文档更新 |
| style | 代码格式更新(不影响功能,如空格、分号等格式修正) |
| refactor | 代码重构 |
| perf | 改善性能 |
| test | 测试 |
| build | 变更项目构建或外部依赖(例如scopes: webpack、gulp、npm等) |
| ci | 更改持续集成软件的配置文件和package中的scripts命令,例如scopes: Travis, Circle等 |
| chore | 变更构建流程或辅助工具 |
| revert | 代码回退 |
1.2 scope
scope说明commit影响的范围。scope依据项目而定,例如在业务项目中可以依据菜单或者功能模块划分,如果是组件库开发,则可以依据组件划分。
1.3 subject
subject是commit的简短描述。
1.4 Body
commit的详细描述,说明代码提交的详细说明。
1.5 Footer
一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接.
二、Commitizen 替换 git commit
过去我们提交代码都是通过git commit 添加描述信息,为了规范化现在需要使用Commitizen进行替换。具体使用如下(主要以项目中使用场景为例进行说明):
- 安装commitizen:
npm i -D commitizen,这时我们就可以通过npx git-cz来替换git commit -m"xxx"(在git add .之后)

npm i -D cz-conventional-changelog,并在pacakge.json中对commit信息模板进行配置
"scripts": {
"commit": "git-cz"
},
"config": {
"commitizen": {
"path": "node_modules/cz-conventional-changelog"
}
},
这样我们通过npm run commit进行提交,同时快捷选择规范的commit提交信息模板了

三、commitlint校验
上述步骤已经能够保证通过commitizen在提交代码的commit信息符合规范,但此时仍可以自行通过git commit -m提交代码,因此有必要通过其他手段进行进一步约束。
- 安装commitlint-cli,用来校验commit是否符合规范
$ npm i -D @commitlint/cli
- 安装@commitlint/config-conventional,一种符合Angular风格的校验规则
$ npm i -D @commitlint/config-conventional @commitlint/cli
- 在项目根目录简历配置文件 commitlint.config.js 或者 .commitlintrc.js
module.exports = {
extends:[
// 符合Angular团队规范的配置,与commitizen中配置的cz-conventional-changelog一致
"@commitlint/config-conventional"
],
rules: {
// 自定义你的规则
}
}
- 校验commit信息的最佳方式就是结合git hook,所以需要配合Husky使用,它可以在git提交的各个生命周期对你的操作进行一系列处理
npm i -D husky
// package.json 中配置git commit提交时的校验钩子
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
这样你再次通过git commit -m提交不规范的说明就会被拒绝了

四、自定义你的校验规则
目前这部分内容尚未实际操作过,想学习的话可以参考这篇文章