git commit提交规范
git commit 提交规范
jetbrains plugin: Git Commit Template
1 | <type>(<scope>): <subject> |
大致分为三个部分(使用空行分割):
- 标题行: 必填, 描述主要修改类型和内容
- 主题内容: 描述为什么修改, 做了什么样的修改, 以及开发的思路等等
- 页脚注释: 放 Breaking Changes 或 Closed Issues
type: commit 的类型
- feat: 新功能、新特性
- fix: 修改 bug
- perf: 更改代码,以提高性能
- refactor: 代码重构(重构,在不影响代码内部行为、功能下的代码修改)
- docs: 文档修改
- style: 代码格式修改, 注意不是 css 修改(例如分号修改)
- test: 测试用例新增、修改
- build: 影响项目构建或依赖项修改
- revert: 恢复上一次提交
- ci: 持续集成相关文件修改
- chore: 其他修改(不在上述类型中的修改)
- release: 发布新版本
- workflow: 工作流相关文件修改
scope: commit 影响的范围, 比如: route, component, utils, build...
subject: commit 的概述, 描述主要修改类型和内容
body: commit 具体修改内容, 描述为什么修改, 做了什么样的修改, 以及开发的思路等等,可以分为多行.
footer: 一些备注, 通常是 BREAKING CHANGE 或修复的 bug 的链接.
示例
fix(修复BUG)
如果修复的这个BUG只影响当前修改的文件,可不加范围。如果影响的范围比较大,要加上范围描述。
例如这次 BUG 修复影响到全局,可以加个 global。如果影响的是某个目录或某个功能,可以加上该目录的路径,或者对应的功能名称。
1 | // 示例1 |
feat(添加新功能或新页面)
1 | feat: 添加网站主页静态页面 |
chore(其他修改)
chore 的中文翻译为日常事务、例行工作,顾名思义,即不在其他 commit 类型中的修改,都可以用 chore 表示。
1 | chore: 将表格中的查看详情改为详情 |
其他类型的 commit 和上面三个示例差不多,在此不再叙述。
git commit 模板
如果你只是个人的项目, 或者想尝试一下这样的规范格式, 那么你可以为 git 设置 commit template, 每次 git commit 的时候在 vim 中带出, 时刻提醒自己:
修改 ~/.gitconfig
, 添加:
1 | [commit] |
新建 ~/.gitmessage
内容可以如下:
1 | head: <type>(<scope>): <subject> |
使用提示git commit
除了jetbrains插件其他方法
写个 commit message
好麻烦,这里介绍下 Commitizen
-- 能够根据提示自动生成符合规范的 commit message
commitizen
安装
1 | npm install -g commitizen |
在项目中使用
然后,在项目目录里,运行下面的命令,使其支持 Angular
的 Commit message
格式。
1 | commitizen init cz-conventional-changelog --save --save-exact |
commit
在提交的时候就可以使用 git cz
就可以根据提示,生成自动化的 commit message
validate-commit-msg
validate-commit-msg
检查你的 commit-message
规范
Commitizen
可以帮助我们规范自己的 commit-message
,但是在团队合作中,如何规范其他成员的 commit
规范呢?
可以使用 validate-commit-msg
来检查你的项目的 commit-message
是否符合格式
validate-commit-msg
安装
1 | npm install --save-dev validate-commit-msg |
husky
安装
按照 validate-commit-msg 中 README 中写的,可以用 validate-commit-msg
作为一个 githook 来验证提交消息,并且推荐了 husky
。
1 | This provides you a binary that you can use as a githook to validate the commit message. I recommend husky. You'll want to make this part of the commit-msg githook, e.g. when using husky, add "commitmsg": "validate-commit-msg" to your npm scripts in package.json. |
执行
1 | npm install husky --save-dev |
并且在 package.json
中的 scripts
字段中加入
1 | "commitmsg": "validate-commit-msg" |
然后每次 git commit
之后,就会自动检查 commit message
是否合格。如果不合格,就会报错
1 | husky > commit-msg (node v9.2.1) |
生成 Change log
如果你的所有 commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成。
生成的文档包括以下三个部分。
- New features
- Bug fixes
- Breaking changes.
每个部分都会罗列相关的 commit ,并且有指向这些 commit 的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容。
conventional-changelog
自动根据 commit
生成 change log
conventional-changelog
安装
1 | npm install -g conventional-changelog-cli |
conventional-changelog
工作流
- Make changes
- Commit those changes
- Make sure Travis turns green
- Bump version in package.json
- conventionalChangelog
- Commit package.json andCHANGELOG.md files
- Tag
- Push
conventionalChangelog
这一步有两种选择
1 | 不会覆盖以前的 Change log,只会在 CHANGELOG.md 的头部加上自从上次发布以来的变动 |
注意:
- 这里安装的是 conventional-changelog-cli,安装 conventional-changelog 会报 conventional-changelog: command not found 的错误
- 查阅了很多文章使用的是
conventional-changelog -p angular -i CHANGELOG.md -w
,这样只能在命令行中 log 出 CHANGELOG 的内容,不会生成文件,如果要生成文件需要使用conventional-changelog -p angular -i CHANGELOG.md -s
。更多的 config 可以使用conventional-changelog --help
查看 - 还需要注意的是,在生成 changlog 之前,需要先使用
$ npm version [version]
更改版本号,然后再生成 changelog,这一步很多的博文都没有写,就会导致增量生成的 CHANGELOG 一直都有之前的 commit 记录。
自动判断版本号
上面步骤有两个需要优化的地方
- 需要在 conventionalChangelog 之前先要更改版本号
- 生成CHANGELOG.md 之后又造成了新的改动,所以还需要再执行一遍提交
所以我们需要自动化的执行这些, commitizen
还依据 conventional message
,创建起一个生态
- conventional-changelog-cl :通过提交记录生成CHANGELOG.md
- conventional-github-releaser :通过提交记录生成 github release 中的变更描述
- conventional-recommended-bump :根据提交记录判断需要升级 Semantic Versioning 哪一位版本号
使用这些工具可以简化发布流程。
1 | cp package.json _package.json && |
在你的项目中规范 commit message
并且根据 commit
自动生成 CHANGELOG.md
- 安装依赖
1 | npm install -g commitizen conventional-changelog conventional-changelog-cli conventional-commits-detector conventional-recommended-bump husky validate-commit-msg |
安装完成之后版本如下(我遇到过 conventional-recommended-bump
是 4.x
的版本会报错 Error: Unable to load the "angular" preset package. Please make sure it's installed.
。降低下版本就好。
1 | /usr/local/lib |
- 在
package.json
中增加script
字段
1 | "changelog": "cp package.json _package.json &&preset=`conventional-commits-detector` && echo $preset && bump=`conventional-recommended-bump -p angular` && echo ${1:-$bump} && npm --no-git-tag-version version ${1:-$bump} &>/dev/null && conventional-changelog -i CHANGELOG.md -s -p ${2:-$preset} && git add CHANGELOG.md package.json package-lock.json && version=`cat package.json` && git commit -m'docs(CHANGELOG): $version' && mv -f _package.json package.json && npm version ${1:-$bump} -m 'chore(release): %s' && git push --follow-tags " |
- 使用 使用
git cz
就可以根据提示,生成自动化的commit message
使用npm run changelog
生成 changelog, tag, 升级 version, 并自动执行 git push
问题
改方案还有一个问题尚未解决,就是使用 conventional-recommended-bump
更换推荐版本,我实验的项目都是只改动了中间的版本号,如果你的项目对版本号要去比较严格,建议使用手动更换版本号的方式。