前言
Commit Message 是开发的日常操作,写好 Message 有以下好处
- 自动化、丰富的变更日志
- 自动版本升级
- 方便 Review
对项目的管理是非常重要的,但是在实际的工作中常常被大家忽略,希望通过本文,能够帮助大家重视 Commit Message 的规范书写。
下图为知名开源库 redux 的部分提交记录
下图为知名开源库 ant-design 的提交记录
可以看出 ant-design 的提交是非常规范的,基本可以根据 Commit Message 知道本次提交的内容,而 redux 的提交记录就比较随意。
为了使团队 Commit Message 变的更加规范,使每次 Commit Message 有更大的意义和作用,从而帮助团队更好的维护工程,建立一套类似于 ant-design 规范是相当于有必要的
Commit Message 规范
Commit Message 由 Header(必填)、Body(选填)、Footer(选填)这三部分组成,格式如下:
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
Header
Header 部分只有一行,包括三个字段:type
(必填)、scope
(选填)、subject
(必填),格式如下:
<type>(<scope>): <subject>
type
type 用于说明 commit 的类别,只允许使用下面的标识
- feat: 一个新功能
- fix: 一个缺陷修复
- docs: 文档更改
- style: 对代码意义无影响的更改(空白、格式化、缺少分号等)
- refactor: 重构,既不修复错误也不添加新功能的代码更改
- perf: 一个改善性能的代码更改
- test: 添加缺失的测试或修正现有测试
- ci: 对持续集成(CI)配置文件和脚本进行的更改
- chore: 不修改源代码(src)或测试文件(test)的其他更改
- revert: 撤销先前的提交
scope
用于说明 commit 影响的范围,视项目不同而不同。
subject
用于描述 commit 的概要,具体要求如下:
- 简要准确的描述本次提交的变动,字符数量不超过 80
- 第一个字母小写(可以使用中文)
- 以动词开头,使用第一人称现在时,比如
change
,而不是changed
或changes
- 不以标点符号结尾
Body
本次 commit 的详细描述,可以分成多行,具体要求如下:
- 详细有条理的描述本次提交的变动,例如具体的变更、影响的范围等
- 可写多行,每行不超过 72 个字符,整体建议不超过 200 个字符
Footer
用于描述 commit 的补充内容,例如关联的 Issue 和 关闭的 Issue
- 关联 Issue: 格式: Issue #1
- 关闭 Issue: 格式: Close #1, #2, #3
规范示例
feat 类日志示例
feat(内容监控): 设备模块添加相关逻辑
fix 类日志示例
fix(设备中心): 修复设备中心直播流无法查看
问题原因: 基础包升级导致
解决方案: 锁定版本
影响范围: 摄像机类设备详情页
Close #12, #13
docs 类日志示例
docs(button): 添加 disabled 属性说明
style 类日志示例
style(login): 去除无用空格
refactor 类日志示例
refactor(device): 抽取 BaseInfo 部分为独立组件
perf 类日志示例
perf: 优化权限验证逻辑,提升计算性能
test 类日志示例
test(button): 添加点击事件测试用例
ci 类日志示例
ci: 添加构建脚本
chore 类日志示例
chore(antd): antd 由 v5.2.0 升级至 v5.3.0
chore: 删除调试代码
revert 类日志示例
revert(event): 回滚事件处理流程添加处理人逻辑
规范落地
团队的每个人的开发习惯各不相同,新的规范的制定出来,如何保证大家都遵从是一个很有挑战的事情,这里会使用社区比较成熟的工具保证规范的落地。
commitlint 可以帮助我们校验 Commit Message,下面将介绍详细的介入步骤
安装依赖
这里以 pnpm 为例
pnpm i -D @commitlint/cli @pasny/commitlint-config
添加配置
项目跟目录新建 commitlint.config.js,写入
module.exports = {
extends: ['@pansy/commitlint-config']
}
结合 husky
校验 Commit Message 的最佳方式是结合 git hook, 所以需要配合 [Husky]typicode.github.io/husky/).
详细介绍,可查看 husky,这里不做累述。
替代 git commit
利用 @commitlint/prompt-cli
,可以交互式的生产规范的 Commit Message,具体接入步骤如下
- 安装依赖
pnpm i -D @commitlint/prompt-cli
2. 在 package.json 添加如下代码
"scripts": {
"commit": "commit"
},
后续就可以直接使用 pnpm commit
替换 git commit
当然比较熟悉该规范的,还是直接使用 git commit
效率更高