提交规范
这段内容定义了 Vue.js 项目中 Git 提交消息的规范,目的是让提交消息标准化、结构化,便于自动化生成变更日志,同时也有助于团队成员更清晰地理解每次提交的目的和影响。以下是各部分内容的具体作用:
完整消息格式
- 消息组成:说明提交消息由标题(header)、正文(body)和页脚(footer)组成,标题包含类型(type)、范围(scope)和主题(subject),并强调标题是必需的,范围是可选的,为开发者提供了详细的消息结构框架。
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
各部分详细规则
回滚(Revert)
- 格式要求:如果提交是对之前提交的回滚,消息应以
revert:开头,后面跟上被回滚提交的标题,并在正文中说明回滚的具体提交哈希值,方便追溯和管理代码变更历史。
类型(Type)
- 日志显示规则:规定以
feat、fix或perf开头的提交会出现在变更日志中,若包含BREAKING CHANGE,则无论类型如何都会出现在变更日志中。同时,给出了非变更日志相关任务的建议前缀,如docs、chore、style、refactor和test,帮助开发者根据提交内容选择合适的类型前缀。
范围(Scope)
- 定义与示例:解释范围用于指定提交变更的具体位置,如
core、compiler、ssr、v-model、transition等,使提交消息更具针对性和可读性。
主题(Subject)
- 描述要求:要求主题使用祈使语气的现在时态,不使用过去式或第三人称;首字母不大写;句末不加句号,使主题简洁明了,准确传达变更内容。
正文(Body)
- 描述规范:同样要求使用祈使语气的现在时态,应包含变更的动机,并与之前的行为进行对比,帮助团队成员理解变更的原因和影响。
页脚(Footer)
- 内容说明:页脚用于包含关于重大变更(
Breaking Changes)的信息,以及引用该提交所解决的 GitHub 问题。重大变更信息应以BREAKING CHANGE:开头,清晰传达变更的影响和范围。
简要正则要求
/^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types)(\(.+\))?: .{1,50}/
这个正则表达式用于验证 Git 提交消息的格式,确保提交消息遵循特定的结构规范,以便自动化生成变更日志和便于团队成员理解每次提交的目的。
下面我们将逐步分析这个正则表达式的各个部分:
类型(Type)完整列表
| 类型 | 用途 |
|---|---|
feat | 新增功能(Feature)。 |
fix | 修复 Bug。 |
polish | 代码优化(非功能或 Bug 修复,如用户体验改进)。 |
docs | 文档更新。 |
style | 代码风格调整(如空格、分号,不影响逻辑)。 |
refactor | 代码重构(既非新功能也非 Bug 修复)。 |
perf | 性能优化。 |
test | 测试用例新增或修改。 |
workflow | 构建流程或工具链变动(如 CI/CD 配置)。 |
chore | 杂项变更(如依赖更新、配置文件调整)。 |
types | 类型定义文件修改(如 TypeScript 类型补全)。 |
-
^:- 这是一个锚点,表示匹配字符串的开始位置。它确保正则表达式从提交消息的开头开始匹配。
-
(revert: )?:()是捕获组,用于将其中的内容作为一个整体进行处理。?是量词,表示前面的元素(即revert:这个字符串)出现 0 次或 1 次。这意味着提交消息可以以revert:开头,也可以不以它开头。如果以revert:开头,通常表示该提交是对之前某个提交的回滚操作。
-
(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types):()同样是捕获组。|是或运算符,表示在它两边的元素中选择其一进行匹配。这里列出了一系列可能的提交类型,如feat(新特性)、fix(修复 Bug)、docs(文档更新)等。提交消息必须包含其中一个类型。
-
((.+))?:()是捕获组。(` 和 `)分别是对左括号(和右括号)的转义,因为括号在正则表达式中有特殊含义,需要使用反斜杠进行转义才能表示普通的括号字符。.+表示匹配任意字符(除换行符外)至少一次。?是量词,表示前面的捕获组((.+))出现 0 次或 1 次。这部分用于指定提交的作用范围,例如(compiler)表示该提交的更改主要影响编译器部分。这个范围是可选的。
-
::- 这是一个普通字符,要求提交消息在类型(或类型和范围)后面必须紧跟一个冒号
:。
- 这是一个普通字符,要求提交消息在类型(或类型和范围)后面必须紧跟一个冒号
-
****:
- 这是一个空格字符,要求冒号后面必须有一个空格。
-
.{1,50}:.表示匹配任意字符(除换行符外)。{1,50}是量词,表示前面的元素(即任意字符)出现 1 到 50 次。这部分用于匹配提交消息的主题,要求主题长度至少为 1 个字符,最多为 50 个字符。
示例匹配
示例解析
1. 新增功能(Feature)
plaintext
复制
feat(compiler): add 'comments' option
- 类型:
feat(新功能) - 作用域:
compiler(影响编译器模块) - 描述: 新增
comments配置选项。 - CHANGELOG 位置: 出现在 "Features" 章节下的
compiler子标题中。
2. 修复 Bug(Fix)
plaintext
复制
fix(v-model): handle events on blur close #28
- 类型:
fix(Bug 修复) - 作用域:
v-model(涉及v-model功能) - 描述: 修复
blur事件处理问题。 close #28: 自动关闭 GitHub Issue #28。- CHANGELOG 位置: 出现在 "Bug Fixes" 章节下的
v-model子标题中。
3. 性能优化(Performance)
plaintext
复制
perf(core): improve vdom diffing by removing 'foo' option
BREAKING CHANGE: The 'foo' option has been removed.
- 类型:
perf(性能优化) - 作用域:
core(核心模块) - 描述: 通过移除
foo选项优化虚拟 DOM 比对性能。 BREAKING CHANGE: 标注这是一个破坏性变更(升级需注意)。- CHANGELOG 位置: 同时出现在 "Performance Improvements" 和 "Breaking Changes" 章节。
4. 回滚提交(Revert)
plaintext
复制
revert: feat(compiler): add 'comments' option
This reverts commit 667ecc1654a317a1333bb17617d973392f415f02.
- 类型:
revert(回滚) - 原始提交: 回滚了哈希为
667ecc1的提交(该提交曾新增comments选项)。 - CHANGELOG 位置: 出现在 "Reverts" 章节(若与原提交在同一版本则不重复显示)。
常见错误
- 缺失类型或描述
❌update compiler→ ✅fix(compiler): handle edge case - 作用域不明确
❌fix: bug→ ✅fix(runtime): handle null props - 描述过长
❌fix: something went wrong when user clicks the button under specific conditions
✅fix(button): handle click event in disabled state