规范化的使用 git commit 对于提高 git log 的可读性,通过统一的规范和流程让团队的小伙伴在约定好的规则内进行沟通和提交,大大增加团队的开发效率,减少后期维护成本
Conventional Commits 约定式提交
一种用于给提交信息增加人机可读含义的规范
约定式提交规范 是一种基于提交消息的轻量级约定。 它提供了一组用于创建清晰的提交历史的简单规则; 这使得编写基于规范的自动化工具变得更容易。 这个约定与 SemVer 相吻合, 在提交信息中描述新特性、bug 修复和破坏性变更。
提交说明的结构如下所示:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
<类型>[可选的作用域]: <描述>
[可选的正文]
[可选的脚注]
提交说明包含了下面的结构化元素,以向类库使用者表明其意图:
-
fix: 类型 为 fix 的提交表示在代码库中修复了一个 bug(这和语义化版本中的 PATCH 相对应)。
- feat: 类型 为 feat 的提交表示在代码库中新增了一个功能(这和语义化版本中的 MINOR 相对应)。
- BREAKING CHANGE: 在脚注中包含 BREAKING CHANGE: 或 <类型>(范围) 后面有一个 ! 的提交,表示引入了破坏性 API 变更(这和语义化版本中的 MAJOR 相对应)。 破坏性变更可以是任意 类型 提交的一部分。
- 除 fix: 和 feat: 之外,也可以使用其它提交 类型 ,例如 @commitlint/config-conventional(基于 Angular约定)中推荐的 build:影响构建系统或外部依赖关系的更改(示例范围:gulp、broccoli、NPM)、chore:其他不修改src或test文件、 ci:更改持续集成文件和脚本(示例范围:Travis、Circle、BrowserStack、SauceLabs)、docs:只是更改文档、style:不影响代码含义的变化(空白、格式化、缺少分号等)、refactor:代码重构,既不修复错误也不添加功能、perf:改进性能的代码更改、test:添加确实测试或更正现有的测试,等等。
- 脚注中除了 BREAKING CHANGE: <description> ,其它条目应该采用类似这样的惯例 git trailer format
其它提交类型在约定式提交规范中并没有强制限制,并且在语义化版本中没有隐式影响(除非它们包含 BREAKING CHANGE)。 可以为提交类型添加一个围在圆括号内的 (scope)范围,以为其提供额外的上下文信息。例如 feat(parser): adds ability to parse arrays.。
示例
包含了描述并且脚注中有破坏性变更的提交说明
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
包含了 ! 字符以提醒注意破坏性变更的提交说明
feat!: send an email to the customer when a product is shipped
包含了范围和破坏性变更 ! 的提交說明
feat(api)!: send an email to the customer when a product is shipped
包含了 ! 和 BREAKING CHANGE 脚注的提交说明
chore!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.
不包含正文的提交说明
docs: correct spelling of CHANGELOG
包含范围的提交说明
feat(lang): add polish language
包含多行正文和多行脚注的提交说明
fix: prevent racing of requests
Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.
Remove timeouts which were used to mitigate the racing issue but are
obsolete now.
Reviewed-by: Z
Refs: #123
约定式提交规范
本文中的关键词 “必须(MUST)”、“禁止(MUST NOT)”、“必要(REQUIRED)”、“应当(SHALL)”、“不应当(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可以(MAY)” 和 “可选(OPTIONAL)” ,其相关解释参考 RFC 2119。
- 每个提交都必须使用类型字段前缀,它由一个名词构成,诸如 feat 或 fix , 其后接可选的范围字段,可选的 !,以及必要的冒号(英文半角)和空格。
- 当一个提交为应用或类库实现了新功能时,必须使用 feat 类型。
- 当一个提交为应用修复了 bug 时,必须使用 fix 类型。
- 范围字段可以跟随在类型字段后面。范围必须是一个描述某部分代码的名词,并用圆括号包围,例如: fix(parser):
- 描述字段必须直接跟在 <类型>(范围) 前缀的冒号和空格之后。 描述指的是对代码变更的简短总结,例如: fix: array parsing issue when multiple spaces were contained in string 。
- 在简短描述之后,可以编写较长的提交正文,为代码变更提供额外的上下文信息。正文必须起始于描述字段结束的一个空行后。
- 提交的正文内容自由编写,并可以使用空行分隔不同段落。
- 在正文结束的一个空行之后,可以编写一行或多行脚注。每行脚注都必须包含 一个令牌(token),后面紧跟 :<space> 或 <space># 作为分隔符,后面再紧跟令牌的值(受 git trailer convention 启发)。
- 脚注的令牌必须使用 - 作为连字符,比如 Acked-by (这样有助于 区分脚注和多行正文)。有一种例外情况就是 BREAKING CHANGE,它可以被认为是一个令牌。
- 脚注的值可以包含空格和换行,值的解析过程必须直到下一个脚注的令牌/分隔符出现为止。
- 破坏性变更必须在提交信息中标记出来,要么在 <类型>(范围) 前缀中标记,要么作为脚注的一项。
- 包含在脚注中时,破坏性变更必须包含大写的文本 BREAKING CHANGE,后面紧跟着冒号、空格,然后是描述,例如: BREAKING CHANGE: environment variables now take precedence over config files 。
- 包含在 <类型>(范围) 前缀时,破坏性变更必须通过把 ! 直接放在 : 前面标记出来。 如果使用了 !,那么脚注中可以不写 BREAKING CHANGE:, 同时提交信息的描述中应该用来描述破坏性变更。
- 在提交说明中,可以使用 feat 和 fix 之外的类型,比如:docs: updated ref docs. 。
- 工具的实现必须不区分大小写地解析构成约定式提交的信息单元,只有 BREAKING CHANGE 必须是大写的。
- BREAKING-CHANGE 作为脚注的令牌时必须是 BREAKING CHANGE 的同义词
为什么使用约定式提交
- 自动化生成 CHANGELOG。
- 基于提交的类型,自动决定语义化的版本变更。
- 向同事、公众与其他利益关系者传达变化的性质。
- 触发构建和部署流程。
- 让人们探索一个更加结构化的提交历史,以便降低对你的项目做出贡献的难度。
最佳实践
好上面那一段摘抄人家网站上的,下面来实战:
用到的插件是 commitizen 、cz-conventional-changelog、 commitlint 和 husky
全局安装 commitizen
npm i commitizen -g
项目中安装cz-conventional-changelog、 commitlint 和 husky
npm i cz-conventional-changelog --save-dev
npm i '@commitlint/cli' '@commitlint/config-conventional' --save-dev
npm i husky --save-dev
然后配置package.json新增:
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
},
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
}
husky 4.x 以上需要手动启用
npx husky install
然后生成.husky配置文件:
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'
行了。试一试无效提交返回的信息:
git commit -m "123"
提交不上去了,提示:
$ git commit -m "123"
⧗ input: 123
✖ subject may not be empty [subject-empty]
✖ found 1 problems, 0 warnings
ⓘ Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint
husky - commit-msg hook exited with code 1 (error)
这时候就到了使用提交规范的时候了,控制台直接输入cz,按照<约定式提交规范>选择即可