Git 提交信息规范

上一篇


引言

:
即每次进行 Git 提交时,需要编写的提交说明。
:
* 创建清晰、结构化的提交历史
* 编写自动化工具
* 直接生成 changelog
* 基于提交的类型,自动决定语义化版本(SemVer)变更
* 让后续代码审查、信息查找、版本回退都更加高效可靠
* ...

:
1. Angular 提交信息规范

复制代码
   > 最初由前端框架 `Angular` 开发团队推出并内部使用,随后逐渐得到肯定和推广
2. [Atom 提交规范](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#git-commit-messages)

   > `Atom` 编辑器项目使用的提交规范
3. [Conventional Commits](https://www.conventionalcommits.org/zh-hans/v1.0.0/)(约定式提交)

   > 由 Angular 提交信息规范衍生而来
4. [ESLint 提交规范](https://eslint.org/docs/latest/contribute/pull-requests#step-2-make-your-changes)

   > `ESLint` 工具项目使用的提交规范
5. 自定义规范

   > 基于主流规范,结合自身业务场景定制提交规范

规范细则

🫧 Important

我们基于 Conventional Commits(约定式提交)约束团队的 Git 提交信息,罗列约束条款如下

核心格式

plaintext 复制代码
<类型>[可选 作用域]: <描述>

[可选 正文]

[可选 脚注]

: 必须提供的字段,用于描述提交的性质。您可以指定如下类型之一:

复制代码
|    类型    |                                  描述                                  |             备注             |
|:--------:|----------------------------------------------------------------------|----------------------------|
|   fix    | 在代码库中修复了一个 bug                                                       | 这和语义化版本中的 `PATCH` 相对应      |
|   feat   | 在代码库中新增了一个功能、特性                                                      | 这和语义化版本中的 `MINOR` 相对应      |
|   docs   | 修改文档                                                                 | 例如修改 README 文件、API 文档等     |
|  style   | 修改代码的样式                                                              | 例如调整缩进、空格、空行等              |
| refactor | 重构代码                                                                 | 例如修改代码结构、变量名、函数名等但不修改功能逻辑  |
|   perf   | 优化性能                                                                 | 例如提升代码的性能、减少内存占用等          |
|   test   | 修改测试用例                                                               | 例如添加、删除、修改代码的测试用例等         |
|  build   | 修改项目构建系统                                                             | 例如修改依赖库、外部接口或者升级 Node 版本等  |
|  chore   | 对非业务性代码进行修改                                                          | 例如修改构建流程或者工具配置等            |
|    ci    | 修改[持续集成](https://www.redhat.com/zh-cn/topics/devops/what-is-ci-cd)流程 | 例如修改 Travis、Jenkins 等工作流配置 |

> ⚠️ **BREAKING CHANGE**
>
>
> 在 ***脚注 (footer)*** 中包含 `BREAKING CHANGE:` 或 \<类型\>\[作用域\] 后面有一个 `!` 的提交,表示引入了破坏性的 API 变更(这和语义化版本中的 `MAJOR` 相对应)。破坏性变更可以是任意 ***类型 (type)*** 提交的一部分。

: 可选字段,用于说明提交影响的范围(如模块、组件、功能点,如 authpayment)。

: 必须提供的字段,用于间接描述提交内容(通常不超过 50 字符,首字母小写,结尾不加标点符号)。

: 可选字段,详细描述提交的动机、修改内容等,可换行。

: 可选字段,用于标注不兼容变更(BREAKING CHANGE: ...)或关联 Issue(如 Closes #123

约定式提交规范

💡 Tip

以下内容中的关键词:

  • 必须 (MUST)
  • 禁止 (MUST NOT)
  • 必要 (REQUIRED)
  • 应当 (SHALL)
  • 不应当 (SHALL NOT)
  • 应该 (SHOULD)
  • 不应该 (SHOULD NOT)
  • 推荐 (RECOMMENDED)
  • 可以 (MAY)
  • 可选的 (OPTIONAL)

其相关解释参考 RFC 2119

  1. 每个提交都 必须 使用类型字段前缀,它由一个名词构成,诸如 featfix 等等,其后接 可选的 作用域,可选的 !,以及 必要 的冒号(英文半角)和空格。
  2. 当一个提交为应用或类库实现了新功能时,必须 使用 feat 类型。
  3. 当一个提交为应用修复了 bug 时,必须 使用 fix 类型。
  4. 作用域字段 可以 跟随在类型字段后面。作用域 必须 是一个描述某部分代码库的名词,并用圆括号包围,例如 fix(parser):
  5. 描述字段 必须 紧跟在 <类型>[作用域] 前缀的冒号和空格之后。描述指的是对代码变更的简短总结,例如 fix: 当字符串中包含多个空格时的数组解析问题
  6. 在简短描述之后,可以 编写较长的提交正文,为代码变更提供额外的上下文信息。正文 必须 起始于描述字段结束的一个空行后。
  7. 提交的正文内容自由编写,并 可以 使用空行分隔不同段落。
  8. 在正文结束的一个空行之后,可以 编写一个或多个脚注。每个脚注都 必须 包含一个令牌(token),后面紧跟 :<空格><空格># 作为分隔符,后面再紧跟令牌的值(受 git trailer convention 启发)。
  9. 脚注的令牌 必须 使用 - 作为连字符,例如 Asked-by(这有助于区分脚注和多个段落正文)。有一种例外情况是 BREAKING CHANGE,其 可以 被认为是一个令牌。
  10. 脚注的值 可以 包含空格和换行,值的解析过程 必须 直到下一个脚注的令牌/分隔符对出现为止。
  11. 破坏性变更 必须 在提交信息中标记出来,要么在 <类型>[作用域] 前缀中标记,要么作为脚注的一项。
  12. 如果作为脚注的一项标记,则破坏性变更 必须 包含大写文本 BREAKING CHANGE,后面紧跟冒号、空格和描述,例如 BREAKING CHANGE: 环境变量现在优先于配置文件
  13. 如果在 <类型>[作用域] 前缀中标记,则破坏性变更 必须 通过在紧挨 : 前的 ! 标记出来。如果使用了 !,那么脚注中 可以 省略 BREAKING CHANGE:,同时提交信息的描述中 应当 描述破坏性变更。
  14. 在提交信息中,可以 使用 featfix 之外的类型,例如 docs: 更新了 ref 文档
  15. BREAKING-CHANGE 作为脚注的令牌时 必须BREAKING CHANGE 的同义词。

示例

包含了描述和破坏性变更脚注的提交信息

plaintext 复制代码
feat: 允许提供的配置对象扩展其他配置

BREAKING CHANGE: 配置文件中的 `extends` 键现在用于扩展其他配置文件

包含了 ! 以提醒注意破坏性变更的提交信息

plaintext 复制代码
feat!: 当产品发货时向客户发送电子邮件

包含了作用域和 ! 以提醒注意破坏性变更的提交信息

plaintext 复制代码
feat(api)!: 当产品发货时向客户发送电子邮件

同时包含了 !BREAKING CHANGE 脚注的提交信息

plaintext 复制代码
chore!: 停止对 Node 6 的支持

BREAKING CHANGE: 使用在 Node 6 中不可用的 JavaScript 功能

不包含正文的提交信息

plaintext 复制代码
docs: 纠正 CHANGELOG 拼写

包含了作用域的提交信息

plaintext 复制代码
feat(lang): 添加波兰语

包含了多段正文和多个脚注的提交信息

plaintext 复制代码
fix: 防止请求竞态

引入请求ID和最新请求的引用。忽略来自最新请求之外的响应。

移除用于缓解竞态条件问题的超时设置,其已经过时。

Reviewed-by: Z
Refs: #123

FAQ


参考

[1] 约定式提交

[2] Conventional 提交规范 - Git Guide


下一篇

相关推荐
charlie1145141913 小时前
Git团队协作完全入门指南(下)
git
golang学习记5 小时前
Facebook 为什么不用 Git?
git·elasticsearch·facebook
GIS阵地5 小时前
git拉取时报错
大数据·git·elasticsearch
无限进步_8 小时前
C++ Vector 全解析:从使用到深入理解
开发语言·c++·ide·windows·git·github·visual studio
charlee448 小时前
Git使用经验总结9-Git提交关联到Issue
git·issue
-拟墨画扇-8 小时前
Git | Bug分支操作
git·gitee·github·bug·gitcode
-拟墨画扇-10 小时前
Git | Feature分支操作
git·gitee·github·gitcode
无限进步_10 小时前
C++多态全面解析:从概念到实现
开发语言·jvm·c++·ide·git·github·visual studio
henreash11 小时前
windows下git的hooks
git