Git Commit Message Style Guide
在 Git 中,我们使用 git commit -m "xxx"
来提交代码,参数 -m
用来指定 Commit Message(提交说明),直接执行 git commit
会进入编辑器模式,可提交多行说明。Commit Message 应规范化,规范化的 Commit Message 能带来很多好处:
1 | * 提交说明明确,方便快速浏览和查找,比如 git log --pretty=format:%s, git log HEAD --grep feature |
目前,社区中有很多 Commit Message 规范,本文介绍 Conventional Commits 规范,因其合理、系统,且有配套工具,在社区中得到来广泛的应用。
Conventional Commits 提交规范
Conventional Commits 中将 Commit message 分为三个部分:Header,Body 和 Footer。
1 | <type>(<scope>): <subject> |
其中,Header 是必需的,Body 和 Footer 可选。<BLANK LINE>
指空行,各个部分必须由空行分割。为了避免自动换行影响美观,不管是哪一个部分,任何一行都不得超过 72 个字符(或 100 个字符)。
1 | docs(changelog): update changelog to beta.5 |
1 | fix(ivy): prevent templateOverrides from causing infinite loop (#29402) |
注:Angular commit message guidelines 采用同样的提交规范。
Header
Header 部分只有一行,包括三个字段:type(必需)、scope(可选)和 subject(必需)。
- type
type 用于说明 Commit 的类别,只允许使用下面 9 个标识。
1 | * feat # 新功能(Feature) |
如果 type 为 feat 和 fix,则该 Commit 将肯定出现在 Change Log 之中。其他情况(docs、chore、style、refactor、test)建议不要放入 Change Log。
- scope
scope 用于说明 Commit 影响的范围,比如框架中的数据层、控制层、视图层,或业务中某个业务模块,视具体项目的不同而不同,比如:user 用户、pay 支付、product 产品、article 文章、core 核心、router 路由、api 接口、doc 文档…
- subject
subject 是 Commit 目的的简短描述,不超过 50 个字符。
1 | * 以动词开头,使用第一人称现在时,比如 change,而不是 changed 或 changes |
常用表述语有:add、change、update、remove、delete。
Body
Body 部分是对本次 Commit 的详细描述,可以分成多行。有两个注意点:
1 | * 使用第一人称现在时,比如使用 change 而不是 changed 或 changes |
Footer
Footer 部分只用于两种情况。
- 不兼容变动
如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。
1 | BREAKING CHANGE: isolate scope bindings definition has changed. |
- 关闭 Issue 或 Pull requests
在开源的项目中,如果当前 commit 针对某个 issue 或 pr,那么可以在 Footer 部分关闭这个 issue 或 pr。例如:
1 | Fixes #21388 |
常用的表述语有 sclose、fix、resolve。
Revert
还有一种特殊情况,如果当前 Commit 用于撤销以前的 Commit,则必须以 revert:
开头,后面跟着被撤销 Commit 的 Header。
1 | revert: feat(pencil): add 'graphiteWidth' option |
Body 部分的格式是固定的,必须写成 This reverts commit
如果当前 Commit 与被撤销的 Commit 在同一个发布(Release)里面,那么它们都不会出现在 Change Log 里面。如果两者在不同的发布,那么当前 Commit,会出现在 Change Log 的 Reverts 小标题下面。
为 git commit 添加表情
为 commit message 添加 Emoji 不仅有趣,也可表达当前提交的类型。Emoji CLDR Short Name 被 GitHub (emoji-cheat-sheet github-emoji-api)、Gitlab、GitBucket 所支持,提交信息中可通过短名的方式使用。
1 | git commit -m ':apple: i have a apple' |
Git 中常用的 Emoji CLDR Short Name 列表如下:
Emoji | Emoji 代码 | Commit 说明 |
---|---|---|
:tada: (庆祝) | :tada: | 初次提交 |
:sparkles: (火花) | :sparkles: | 引入新功能 |
:bug: (虫子) | :bug: | 修复 bug |
:lipstick: (口红) | :lipstick: | 更新 UI 和样式文件 |
:art: (调色板) | :art: | 改进代码结构/代码格式 |
:hammer: (锤子) | :hammer: | 重大重构 |
:zap: (闪电) :racehorse: (赛马) |
:zap: :racehorse: |
提升性能 |
:fire: (火焰) | :fire: | 移除代码或文件 |
:wrench: (扳手) | :wrench: | 修改配置文件 |
:construction_worker: (工人) | :construction_worker: | 添加 CI 构建系统 |
:green_heart: (绿心) | :green_heart: | 修复 CI 构建问题 |
:heavy_minus_sign: (减号) | :heavy_minus_sign: | 减少一个依赖 |
:heavy_plus_sign: (加号) | :heavy_plus_sign: | 增加一个依赖 |
:ambulance: (急救车) | :ambulance: | 重要补丁 |
:rotating_light: (警车灯) | :rotating_light: | 移除 linter 警告 |
:memo: (备忘录) | :memo: | 撰写文档 |
:rocket: (火箭) | :rocket: | 部署功能 |
:white_check_mark: (白色复选框) | :white_check_mark: | 增加测试 |
:lock: (锁) | :lock: | 修复安全问题 |
:globe_with_meridians: (地球) | :globe_with_meridians: | 国际化与本地化 |
:apple: (苹果) | :apple: | 修复 macOS 下的问题 |
:penguin: (企鹅) | :penguin: | 修复 Linux 下的问题 |
:checkered_flag: (旗帜) | :checked_flag: | 修复 Windows 下的问题 |
:bookmark: (书签) | :bookmark: | 发行/版本标签 |
:construction: (施工) | :construction: | 工作进行中 |
:arrow_down: (下降箭头) | :arrow_down: | 降级依赖 |
:arrow_up: (上升箭头) | :arrow_up: | 升级依赖 |
:chart_with_upwards_trend: (上升趋势图) | :chart_with_upwards_trend: | 添加分析或跟踪代码 |
:whale: (鲸鱼) | :whale: | Docker 相关工作 |
:pencil2: (铅笔) | :pencil2: | 修复 typo |
Emoji 还可对单个 commit type 再次进行细分,比如 feat
下 :tada: feat
表示初始化项目,:sparkles: feat
引入新功能(默认),:lipstick: feat
修改样式。
这套 Emoji 规范的使用,需要配合编辑器插件、Git Commit 交互式工具(比如 gitmoji)或着 Git Commit Template,否则一个个查找难以使用。
注:除了使用 Emoji 短名,也可以直接在 commit message 中使用 Emoji code,VSCode 中可通过 git-commit-plugin 插件(但是这个插件所使用的 Emoji 语义与上面通用的不一致)。
设置 Commit Message Template
通过设置全局 .gitconfig 来指定 Commit Message 模板。
1 | git config --global commit.template C:/Users/CCH/commit-template |
1 | <:tada: :sparkles: :lipstick: feat | :bug: :ambulance: fix | :hammer: refactor | :zap: :racehorse: perf | :art: style | :memo: docs | :wrench: ci | :wrench: :heavy_plus_sign: :heavy_minus_sign: chore>: <subject> |
TortoiseGit 中可通过依次点击 settings -> Git -> Edit global .gitconfig
,然后编辑这个全局 .gitconfig 文件,在其末尾加入 commit 字段配置。
1 | [user] |