0%

git规范提交

小时候感觉时间过得好慢,长大了感觉时间过得好快。。。

一、概念

      要说清楚提交的概念,首先要清楚git的工作原理,最基本的要理解三个区:工作区、暂存区、本地仓库(其实还有一个远程仓库,暂时用不到),传送门。假如你弄清楚了以上这些概念,那git提交其实就是把暂存区的内容提交到仓库,简单一个git commit -m 'commit message'就够了,当然这不是此文的重点。Git每次提交代码,都要写commit message,否则就不允许提交,用过Git都知道这一点。可能因为各种原因比如公司硬性要求等,或者纯粹的就是为了能通过提交,很多人就按照自己的方式去那么干了。

      博主从毕业到现在5年多时间了,前后经历过几家大大小小的公司,见过五花八门各种各样的提交信息,说不上好坏对错,就只是觉得应该有一个相对来说比较规范的东西出来。GG一下关于git提交的文章太多了,大多都是相互copy and paste一下,包括此篇。好习惯是慢慢养成的,可以从很小的一件事情做起,比如简单的一次提交,Let's do it !

二、提交规范

  1. commit message的作用

    • 提供更多的历史信息,方便快速浏览。
    • 过滤某些commit,便于快速查找信息。
    • 基于commit生成change log。
  2. commit message的格式

每次提交,commit message都包括三个部分:header,body和footer,其中header是必需的,bodyfooter可以省略。另外,为了避免自动换行影响美观,不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。

1
2
3
4
5
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
  • header:这部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。

    • type用于说明commit的类别,只允许使用下面7个标识:

      • feat:新功能(feature)

      • fix:修补bug

      • docs:文档(documentation)

      • style: 格式(不影响代码运行的变动)

      • refactor:重构(既不是新增功能,也不是修改bug的代码变动)

      • test:增加测试

      • chore:构建过程或辅助工具的变动

        如果typefeatfix,则该commit将肯定出现在change log之中,其他情况你定。

    • scope用于说明commit影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

    • subjectcommit目的的简短描述,不超过50个字符。

      • 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
      • 第一个字母小写
      • 结尾不加句号.
  • body:这部分是对本次commit的详细描述,可以分成多行,有两点注意:

    • 使用第一人称现在时,比如使用change而不是changed或changes。
    • 应该说明代码变动的动机,以及与以前行为的对比。
  • footer:这部分只用于两种情况:不兼容变动和关闭Issue

    • 不兼容变动:如果当前代码与上一个版本不兼容,则footer部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。
    • 关闭Issue:如果当前commit针对某个issue,那么可以在footer部分关闭这个issue,也可以关闭多个issue

特殊情况:Revert,如果当前commit用于撤销以前的commit,则header必须以revert:开头,后面跟着被撤销commitheaderbody部分的格式也是固定的,必须写成This reverts commit &lt;hash>.,其中的hash是被撤销commitSHA标识符。

三、工具

  1. Commitizen,用于撰写一个合格commit message的工具。
  2. validate-commit-msg,用于检查Node项目的 commit message是否符合格式。

四、demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fix(ngRequired): set error correctly when inside ngRepeat and false by default

Previously, in the required validator, we would read the required setting directly
from attr.required, where it is set by ngRequired.

However, when the control is inside ngRepeat, ngRequired sets it only after a another digest has
passed, which means the initial validation run of ngModel does not include the correct required
setting. (Before commit 0637a21 this would not have been a problem,
as every observed value change triggered a validation).

We now use the initially parsed value from ngRequired in the validator.

Fixes #16814
Closes #16820

五、自定义提交信息

  1. 切换到某个目录cd ~ && mkdir templates && touch {custom}_template
  2. 编辑模板vim {custom}_template,可根据项目情况自定义提交信息,如
1
2
3
4
5
6
7
8
9
Desc:本次提交的描述信息,一般建议50字以内

Type:本次提交的核心信息,一般为固定几个之:add/update/delete/fix/optimize/refactor等

Scope:本次提交的影响范围,如新增一个类文件,修改某个方法等

Date:本次提交的事件

Author:本次提交的坐着
  1. 切换到项目目录cd your_project

  2. 设置提交模板git config commit.template {custom}_template

  3. 指定编辑器git config core.editor vim

  4. 测试提交

    • git commit后会自动弹出vim编辑框
    • git commit -m 'msg',也可自定义提交信息

六、参考

  1. 参考一
  2. 参考二
  3. 参考三