Conventional Commits
定义
当多人参与开发时,对于提交的代码需要有一个标准的格式和规范,这就是Conventional Commits(约定式提交)。
Conventional Commits规范是一个定义提交消息格式的规范,其目的是使提交消息能够清晰、简洁、易于阅读,并且能够自动化生成变更日志。其主要包括两个部分:提交消息的结构与提交消息的类型
提交消息的结构
提交消息包括两个主要部分:头部和主体。头部由三个部分组成:类型<type>
、作用域scope
和主题description
。类型<type>
表示此次提交的目的和意图,作用域scope
表示此次提交影响的范围,主题description
则简要描述此次提交的内容。主体是可选的,可以用于详细描述此次提交的修改内容。
提交消息的结构应如下所示:
1 | <type>[optional scope]: <description> |
例如,下面是一个符合“Conventional Commits”规范的提交消息:
1 | sqlCopy codefeat(user): add login functionality |
这个提交消息的类型是“feat”(表示新增功能),作用域是“user”(表示此次提交仅涉及用户模块),主题是“add login functionality”(表示此次提交增加了登录功能)。主体部分body
则进一步详细描述了此次提交的修改内容。
提交消息的类型
“Conventional Commits”规范定义了一组常见的提交消息类型,每个类型都表示一种不同的提交目的和意图。这些类型包括:
feat
:新增功能(feature)fix
:修复 bugdocs
:更新文档(documentation)style
:调整代码风格,如改变缩进、空格等refactor
:重构代码,既不新增功能也不修复 bugtest
:新增或修改测试用例chore
:更新构建过程、辅助工具等perf
: 提高性能的代码更改build
: 影响生成系统或外部依赖项的更改 (example scopes: gulp, broccoli, npm)ci
: 对 CI 配置文件和脚本的更改 (example scopes: Travis, Circle, BrowserStack, SauceLabs)
BREAKING CHANGE: 在脚注中包含 BREAKING CHANGE:
或 <类型>(范围) 后面有一个 !
的提交,表示引入了破坏性 API 变更(这和语义化版本中的 MAJOR
相对应)。 破坏性变更可以是任意 类型 提交的一部分
更多类型参考: @commitlint/config-conventional(基于 Angular 约定)
提交消息的脚注
除了头部和类型之外,还有一些可选的标记可以在提交消息中使用,用于提供更多信息或标记本次提交的状态。这些标记包括:
BREAKING CHANGE
:用于标记本次提交引入了破坏性变更,即可能导致现有代码无法正常运行的修改。CLOSES
/FIXES
/RESOLVES
:用于与问题跟踪系统(如 GitHub Issues)集成,指示本次提交关闭了某个问题或修复了某个 bug。
使用这些标记可以进一步提高提交消息的可读性和自动化程度。例如,下面是一个使用了标记的提交消息示例:
1 | sqlCopy codefeat: add user search feature |
这个提交消息表示新增了用户搜索功能,其中使用了BREAKING CHANGE
标记来指示本次提交引入了破坏性变更。另外还使用了Closes
和Resolves
标记来指示本次提交关闭了两个问题。
最后,使用“Conventional Commits”规范还可以方便地自动生成变更日志。由于每个提交消息都包含了类型和主题信息,因此可以根据提交消息自动分类和汇总变更内容,生成格式化的变更日志。这样可以方便地查看每个版本的变更内容,以及针对特定类型的变更进行统计和分析。
示例
包含了描述并且脚注中有破坏性变更的提交说明
1 | feat: allow provided config object to extend other configs |
包含了 !
字符以提醒注意破坏性变更的提交说明
1 | feat!: send an email to the customer when a product is shipped |
包含了范围和破坏性变更 !
的提交說明
1 | feat(api)!: send an email to the customer when a product is shipped |
包含了 !
和 BREAKING CHANGE 脚注的提交说明
1 | chore!: drop support for Node 6 |
不包含正文的提交说明
1 | docs: correct spelling of CHANGELOG |
包含范围的提交说明
1 | feat(lang): add polish language |
包含多行正文和多行脚注的提交说明
1 | fix: prevent racing of requests |