git commit规范化,即git commitizen工具的使用

526 阅读3分钟

为什么要对git commit信息进行规范化

Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。但是,一般来说,commit message 应该清晰明了,说明本次提交的目的。但是每个人的做事风格不一,很有可能提交的说明让人看不懂,举个极端的例子,如下图:

所以,最好能有一个规范进行约束,这样能够降低团队间的沟通成本,让提交日志简单易懂,团队外的人员也更容易看懂!

规范化git commit 信息的作用

  • 提供更多的历史信息,方便快速浏览。
  • 可以过滤某些commit(比如文档改动),便于快速查找信息
  • 可以直接从commit生成Change log。
  • 可读性好,清晰,不必深入看代码即可了解当前commit的作用。
  • 为 Code Reviewing做准备
  • 方便跟踪工程历史
  • 让其他的开发者在运行 git blame 的时候想跪谢
  • 提高项目的整体质量,提高个人工程素质

git commit规范化工具git Commitizen的使用

安装

全局安装commitizen

npm install -g commitizen

在项目中使用

  1. 首先需要在项目中初始化commitizen,切换到项目的根目录下,让后执行如下命令:
commitizen init cz-conventional-changelog --save --save-exact
  1. 提交代码时使用,需要执行命令
git add .
git cz //不在需要执行git commit,全部改为git cz

此时会出现提示,按提示一步步输入commit信息,完成后即为格式化后的commit信息

git commitizen的格式化结构

每次提交,Commit message 都包括三个部分:header,body 和 footer。

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

其中,header 是必需的,body 和 footer 可以省略。不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。

  • Header

    Header 部分只有一行,包括三个字段:type(类型,必需)、scope(影像范围,可选)和subject(简略信息,必需)。

    • type

      用于说明 commit 的类别,只允许使用下面11个标识。

      • feat:功能
      • fix:修复bug
      • docs:只改动了文档相关的内容
      • style:不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
      • refactor:代码重构
      • perf:提高性能的改动
      • test:添加测试或者修改现有测试
      • build:构造工具的或者外部依赖的改动,例如webpack,npm
      • ci:与CI(持续集成服务)有关的改动
      • chore:其它杂项修改,例如构建过程或辅助工具的变动
      • revert:执行git revert打印的message
    • Scope

      用来说明本次Commit影响的范围,即简要说明修改会涉及的部分,这个是选填项。

    • Subject

      用来简要描述本次改动,要精简概述,后面在Body里还可以给出具体信息。并且最好遵循下面两条:

      • 以动词开头,使用第一人称现在时,比如change(更改),而不是changed(更改了)或changes
      • 结尾不用句号
  • body

    本次改动的详细描述

  • footer

    脚注部分,此部分一般只用于以下两种情况:

    • 不兼容变动

      如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。

      BREAKING CHANGE: isolate scope bindings definition has changed.
      To migrate the code follow the example below:
      
      Before:
      
      scope: {
      	myAttr: 'attribute',
      }
      
      After:
      
      scope: {
      	myAttr: '@',
      }
      
      The removed `inject` wasn't generaly useful for directives so there should be no code using it.
      
      
    • 关闭Issue

      如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。

      Closes #234