Skip to content

10.6 Git 提交规范

代码规范是开发编码过程中需要遵守的规范。在多人协作中,我们还不得不重视另一个非代码的规范 —— 提交规范。提交规范当然是指 Git 提交描述的规范,在第 10 章时简单提到一笔带过,本节我们来详细介绍。

10.6.1 制定规范

虽然 Git 不会要求如何填写提交描述信息,但提交是一个阶段完成工作的总结,也是团队审阅代码的依据,因此提交规范非常重要,会让开发进度变得清晰有条理。

试想,如果团队成员的 commit 信息是随意填写的,在协作开发和 Review 代码时,其他人无法从 commit 描述中了解该提交完成了什么功能、修复了什么 Bug,只能查看代码变更记录,这样协作者在跟踪某一个功能变更时就会困难重重。

为了直观的看出 commit 的更新内容,开发者社区诞生了一种规范,将 commit 按照功能划分,加一些固定前缀,比如 “fix:”,“feat:”,用来标记这个 commit 主要做了什么事情,这样就可以清晰地将提交分类。

目前这些主流的前缀已经成为了通用规范,其关键字和代表的含义如下:

  • feat: 新增功能。
  • fix: 修复 Bug。
  • perf: 优化性能。
  • refactor: 代码重构。
  • chore: 杂项,其他更改。
  • build: 构建相关更改。
  • ci: 持续集成配置。
  • style: 样式更改。
  • test: 单元测试更改。

假设你刚刚开发完成了用户模块功能,创建了一次提交;接着发现了用户名展示错误,修改后又创建了一次提交,这两次提交时填写的描述信息应该是这样的:

sh
$ git commit -m "feat: 完成用户模块"
$ git commit -m "fix: 修复用户名展示错误"

这样看提交信息就很规范了。后期在审阅代码时,可以直接看出这些提交做了什么,以便快速定位。

注意:提交前缀要写到提交信息的最前面,紧跟着一个英文冒号(不是中文冒号),且冒号后有一个空格,这些细节也要遵守。

很多人开始写前缀时记不住关键字,觉得繁琐。这里推荐一个非常好用的工具,可以自动生成前缀,避免手动输入。该工具名为 “cz-conventional-changelog”,搜索查看详细的用法。

工具 GitHub 地址:https://github.com/commitizen/cz-conventional-changelog

使用这个工具前,首先全局安装:

sh
npm install -g commitizen cz-conventional-changelog

接着在用户目录下创建配置文件(~/.czrc)并写入如下配置:

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

现在创建提交时就可以用 “git cz” 命令来代替 “git commit” 命令,效果如下:

然后上下箭选择前缀,根据提示即可方便的创建符合规范的提交。

10.6.2 验证规范

有了规范之后,光靠人的自觉遵守是不行的,还要在流程上对提交信息进行校验。

这个时候,我们要用到一个新东西 —— “git hook”,也就是 Git 钩子。

Git hook 的作用是在 Git 动作发生前后触发自定义脚本。这些动作包括提交,合并,推送等,我们可以利用这些钩子在 Git 流程的各个环节实现自己的业务逻辑。

Git hook 分为客户端 hook 和服务端 hook。客户端 hook 主要有四个:

  • pre-commit:提交信息前运行,可检查暂存区的代码。
  • prepare-commit-msg:不常用。
  • commit-msg:非常重要,检查提交信息就用这个钩子。
  • post-commit:提交完成后运行。

服务端 hook 包括:

  • pre-receive:非常重要,推送前的各种检查都在这。
  • post-receive:不常用。
  • update:不常用。

大多数团队是在客户端做校验,所以我们用 “commit-msg” 钩子在客户端对 commit 信息做校验。幸运的是,我们不需从头开始编写校验逻辑,社区有成熟的方案:husky + commitlint。

Husky 用于创建 Git 客户端钩子,commitlint 用于校验提交信息是否符合上述规范。首先执行以下安装命令:

sh
$ yarn add -D husky @commitlint/cli @commitlint/config-conventional

接着创建 “commitlint.config.js” 配置文件,并写入以下内容:

js
module.exports = {
  extends: ["@commitlint/config-conventional"],
};

现在 commitlint 命令可以正常执行了。我们再使用 Husky 创建 pre-commit 钩子并写入检查提交的命令:

sh
$ npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

现在在执行 “git commit” 之前,就会进行规范检查。阻止创建不符合 commit 规范的提交,从源头保证提交的规范。

本章小结

本章介绍了什么是代码规范,为什么需要代码规范,有过团队协作经验的开发者们必然能体会到规范的重要性。如果你还没有关注到代码规范,或者想要尝试却没有一个参考标准,那么本章的内容非常适合你,你可以按照本章介绍的流程逐步接入相对完善的规范体系。

代码规范也许在小团队中不受重视,但是从个人成长来看,代码规范是参与开源项目的前提。全世界最牛的开发者和开源项目都集中在 GitHub 上,当你学习这些项目,甚至与大牛一起参与贡献的时候,会发现不懂代码规范根本无法参与协作。因此不管你在什么样的团队,请不要忽视代码规范!