跳到主要内容

commit 规范

规范

Angular commit 规范

https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines

Format

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
  • 头部信息为必填,头部中 scope 为可选
  • 每一行不能超过 100 个字符

Type

  • feat: 需求
  • fix: bug 修复
  • docs: 文档
  • style: 不影响语义的代码格式变更(空格,缩进)
  • refactor: 不是需求或 bug 修复的代码变更(重构)
  • perf: 提升性能的变更
  • test: 添加或修改测试用例(测试相关)
  • chore: 构建变更、工具变更等

Scope

定义 commit 的变更范围、位置,可使用 * 代表多个位置

Subject

用来简短的描述变更内容

  • 使用命令式现实时语法(change not changed nor changes)
  • 首字母不大写
  • 尾部不要句号(. 。)

Body

包含修改的动机和变更的内容(具体的细节),同样适用命令式现在时

需要包含所有的 Breaking Changes,还有 issue 的引用等(使用 close 等来操作 issue 等),其它的想要放在 commit 里的信息也可放在这里

  • Breaking Changes 使用 BREAKING CHANGE: 标识,后接空格(单行)或两个空行(多行)填写内容

Revert

Revert 格式:revert: This reverts commit <hash>.

Conventional Commits

https://www.conventionalcommits.org/en/v1.0.0/

Format

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]
  • 与 Angular commit 规范格式基本一致
  • Conventional Commits 未定义具体的 types 列表(只定义了 feat 和 fix),较为宽泛
  • Conventional Commits 的 BREAKING CHANGE 语法多了一种,除了在 footer 中写明外,也可在 <type>[optional scope] 后追加 ! 来表明为 BREAKING CHANGE
  • footer 中除了 BREAKING CHANGE 同样可以填写其它内容

SemVer

规范与 SemVer 相吻合,fix 对应 PATCH,feat 对应 MINOR,而 BREAKING CHANGE 对应 MAJOR,其它 type 对版本无影响

Specification

具体规范内容

  1. 每个提交都必须使用类型字段前缀,它由一个名词构成,诸如 featfix,其后接可选的范围字段,可选的 !,以及必要的冒号(英文半角 )和空格。
  2. 当一个提交为应用或类库实现了新功能时,必须使用 feat 类型。
  3. 当一个提交为应用修复了 bug 时,必须使用 fix 类型。
  4. 范围字段可以跟随在类型字段后面。范围必须是一个描述某部分代码的名词,并用圆括号包围,例如: fix(parser):
  5. 描述字段必须直接跟在 <类型>(范围) 前缀的冒号和空格之后。 描述指的是对代码变更的简短总结,例如: fix: array parsing issue when multiple spaces were contained in string
  6. 在简短描述之后,可以编写较长的提交正文,为代码变更提供额外的上下文信息。正文必须起始于描述字段结束的一个空行后。
  7. 提交的正文内容自由编写,并可以使用空行分隔不同段落。
  8. 在正文结束的一个空行之后,可以编写一行或多行脚注。每行脚注都必须包含 一个令牌(token),后面紧跟 :<space><space># 作为分隔符,后面 再紧跟令牌的值(受 git trailer convention 启发)。
  9. 脚注的令牌必须使用 - 作为连字符,比如 Acked-by (这样有助于 区分脚注和多行正文)。有一种例外情况就是 BREAKING CHANGE,它可以被认为是一 个令牌。
  10. 脚注的值可以包含空格和换行,值的解析过程必须直到下一个脚注的令牌/分隔符出现为止。
  11. 破坏性变更必须在提交信息中标记出来,要么在 <类型>(范围) 前缀中标记,要么作为脚注的一项。
  12. 包含在脚注中时,破坏性变更必须包含大写的文本 BREAKING CHANGE,后面紧跟着冒号、空格,然后是描述,例如: BREAKING CHANGE: environment variables now take precedence over config files
  13. 包含在 <类型>(范围) 前缀时,破坏性变更必须通过把 ! 直接放在 : 前面标记出来。 如果使用了 !,那么脚注中可以不写 BREAKING CHANGE:,同 时提交信息的描述中应该用来描述破坏性变更。
  14. 在提交说明中,可以使用 featfix 之外的类型,比如:docs: updated ref docs.
  15. 工具的实现必须不区分大小写地解析构成约定式提交的信息单元,只有 BREAKING CHANGE 必须是大写的。
  16. BREAKING-CHANGE 作为脚注的令牌时必须是 BREAKING CHANGE 的同义词。

Demos

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

Revert

规范没有强制定义 revert 的 commit,但是给了推荐

revert: let us never again speak of the noodle incident

Refs: 676104e, a215868

Why

  • 自动化生成 CHANGELOG。
  • 基于提交的类型,自动决定语义化的版本变更。
  • 向同事、公众与其他利益关系者传达变化的性质。
  • 触发构建和部署流程。
  • 让人们探索一个更加结构化的提交历史,以便降低对你的项目做出贡献的难度。

工具

Commitizen

使用 Commitizen cli 可以使用表单填写的方式帮助开发者规范 commit

安装

全局/直接使用 npx 调用(?理论上名字和 bin 不一致无法直接调用)

或者安装到项目中

安装后使用 npx cz 启动,全局安装可直接使用 git cz

安装后直接调用会和 git commit 一样,(文档说默认会启用 git-cz adapter,不过尝试了无效果,而且好像有 bug,所有操作都需要触发两次才有效果)需要 Commitizen friendly,就是配置对应的 adapter

推荐安装在本地然后使用 npx cz 执行

adapter

如果要使用 angular 规范(conventional-changelog),使用 commitizen init cz-conventional-changelog --save-dev --save-exact 来自动化安装,或者直接 pnpm add cz-conventional-changelog,然后将下方配置添加到 package.json

"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
}

也可以通过 .czrc 文件配置

{
"path": "cz-conventional-changelog"
}

path 是为了告诉 commitizen adapter 的地址,使用 require.resolve 来解析

其它的 adapter 也是一样安装。

使用较多的 adapter:

  • git-cz
  • cz-conventional-changelog
  • cz-customizable
  • @commitlint/cz-commitlint

commitizen badge

Commitizen friendly

配合 husky

https://commitizen.github.io/cz-cli/ Optional: Running Commitizen on git commit

参考文档配置 git commit hook

配合新版 husky 现在存在问题,配置后使用 git commit 会在提交结束后进入 git 自带的消息确认页面,可以通过 git commit -m 'a' 来跳过触发,或者直接创建一个 alias,但是添加 hook 之后还存在一个问题,就是如果直接调用 npx cz 会连续启动两次 cz ORZ,目前阶段不建议配合使用

https://github.com/typicode/husky/issues/862

monorepo

https://github.com/commitizen/cz-cli/issues/782

目前暂不支持

只能自己写脚本解决

npx cz --retry 在某些情况下会很方便,不过存在 bug,提交后需要自行关闭,而且某些情况下提交会卡住

npx cz 没有提交文件也会继续执行,然后执行到最后报错,也算是个 bug

校验

commitlint

npx commitlint --from HEAD~1 --to HEAD --verbose 使用 from to 批量校验 commit 信息

自定义配置

https://commitlint.js.org/#/reference-rules

{
"parserPreset": "conventional-changelog-conventionalcommits",
"rules": {
"body-leading-blank": [1, "always"],
"body-max-line-length": [2, "always", 100],
"footer-leading-blank": [1, "always"],
"footer-max-line-length": [2, "always", 100],
"header-max-length": [2, "always", 100],
"scope-case": [2, "always", "lower-case"],
"subject-case": [0],
"subject-empty": [2, "never"],
"subject-full-stop": [2, "never", "."],
"type-case": [2, "always", "lower-case"],
"type-empty": [2, "never"],
"type-enum": [2, "always", ["feat", "fix", "docs", "style", "test", "refactor", "chore", "revert"]]
}
}

changelog

发版

备注

Angular commit

https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines

conventional-changelog

https://github.com/conventional-changelog/conventional-changelog

conventional-changelog:angular 中使用的规范工具

  • conventional-changelog:angular 的 commit 规范定义
  • conventional-changelog-cli:采用 angular commit 规范,自动生成 changelog 的 cli

git interpret-trailers

https://git-scm.com/docs/git-interpret-trailers

git 的 commit message 结构化信息

git-cz

https://github.com/streamich/git-cz

commitizen 的 adapter

  • 支持自定义配置
  • 支持 emoji
  • 支持非交互模式

cz-conventional-changelog

https://github.com/commitizen/cz-conventional-changelog

commitizen 的 conventional-changelog 规范 adapter

  • 支持自定义配置

cz-customizable

https://github.com/leoforfree/cz-customizable

commitizen 的强自定义 adapter,支持定义一些细节规范

semantic-release

https://github.com/semantic-release/semantic-release

自动版本管理,发版工具

standard-version

https://github.com/conventional-changelog/standard-version

自动版本管理,changelog 生成工具

husky

https://github.com/typicode/husky

git pre-commit hooks 工具

commitlint

https://github.com/conventional-changelog/commitlint

commit 信息校验工具

@commitlint/prompt-cli

提供的类似 commitizen 工具,但是较为简陋