关于Git commit

534 阅读6分钟

git commit 的重要性

当你学会使用git,并在GitHub上建立了自己的Repositories时。

嗯。可以push自己的代码了,一顿

  1. git pull origin master
  2. git add .
  3. git commit -m"balabala"
  4. git push origin master

看到100%之后开心极了。几个月后看到如下

请问上传的注册页面在哪里呢???想必你也心里充满了疑虑,我到底放在哪个里面的??

由此可见git add和git commit并不是很简单的一次全部完成的

正确的使用git add 和 git commit

当你每次push的时候,一定是更新了一些代码,完善了一些功能。

例如:

1. 注册功能
2. 登录功能
3. 完善了README

那么该如何的push这次代码呢??

  1. 提交注册功能的功能代码
    git add src/register
    git commit -m"add register function"
  1. 提交登录功能的代码
    git add src/login
    git commit -m"add login function"
  1. 提交完善的README
    git add READM.md
    git commit -m"modify README"

做完以上之后,你就可以正常的

git push origin mater

当然,这样只是一个简单push

进一步的规范你的git commit

你以为做到上面这些你就可以完成规范的git commit 了吗??

太天真你,一般规范的commit需要由三部分构成

<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

其中,Header 是必需的,Body 和 Footer 可以省略。

不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。

1.Header

Head这部分只有一行,但是包括三个部分

< type >(必需)< scope >(可选)< subject >(必需)

(1) < type >

type用来说明commit的类别,也就是说别人看了你的type就知道你这次push的性质是什么,只允许有以下几种标识

  • init: 初始化项目,往往用于仓库刚刚建立,建好项目框架之后的一次push
  • feat: 新功能(feature)
  • docs: 文档的提交(document)
  • fix: 修补bug
  • style: 格式的改动(不影响代码运行的变动,往往是规范了代码的格式)
  • refactor: 重构(既不增加新功能,也不改任何的bug)
  • test: 增加测试
  • chore: 构建过程或辅助工具的变动
  • opt: 优化和改善,比如弹窗进行确认提示等相关的,不会改动逻辑和具体功能等
  • other: 用于难以分类的类别(不建议使用,但一些如删除不必要的文件,更新.ignore之类的可以使用)

      如果type为feat和fix,则该 commit 将肯定出现在 Change log 之中。其他情况(docs、chore、style、refactor、test)由你决定,要不要放入 Change log,建议是不要。

(2) < scope >

scope用于说明commit的影响范围,比如数据层,控制层,视图层等

      (可选)类型后面可以加上括号,括号内填写主要变动的范围,比如按功能模块分,某模块;或按项目三层架构模式分,分数据 层、控制层之类的。

#:表示模块
#student --> 表示 学生模块 (具体的模块开头字母小写,驼峰命名)
#ALL --> 表示 所有模块 (特殊含义如ALL表所有,MOST表大部分,用大写字母表示)
#MOST --> 表示 大部分模块

e.g. feat(#student): 新增添加学生的功能 —— 表示student模块新增功能,功能是添加学生

(3)< subject >

subject是 commit 目的的简短描述,不超过50个字符。

- 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
- 第一个字母小写
- 结尾不加句号(.)

2. Body

body部分是对本次commit的详细描述,可以分成多行进行描述可以分成多行,正文在 72 个字符处换行。

使用正文解释是什么(what)和为什么(why),而不是如何做,以及与以前行为的对比。

于是可以这样写:

balabala : balabala

what:
balabala

why:
balabala

3. Footer

Footer只用于两种情况

(1)不兼容变动

如果当前代码与上一个版本不兼容,则 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.

(2)关闭 Issue

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

Closes #234

也可以一次关闭多个 issue 。

Closes #123, #245, #992

4. Revert

还有一种特殊情况,如果当前 commit 用于撤销以前的 commit,则必须以revert:开头,后面跟着被撤销 Commit 的 Header。

revert: feat(pencil): add 'graphiteWidth' option

This reverts commit 667ecc1654a317a13331b17617d973392f415f02.

Body部分的格式是固定的,必须写成This reverts commit <hash>.,其中的hash是被撤销 commit 的 SHA 标识符。

如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。如果两者在不同的发布,那么当前 commit,会出现在 Change log 的Reverts小标题下面。

几个优秀的撰写合格的commit的工具

1. Commitizen

Commitizen是一个撰写合格 Commit message 的工具。

安装命令如下。

$ npm install -g commitizen

然后,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。

$ commitizen init cz-conventional-changelog --save --save-exact

以后,凡是用到git commit命令,一律改为使用git cz。这时,就会出现选项,用来生成符合格式的 Commit message。

2. validate-commit-msg

validate-commit-msg 用于检查 Node 项目的 Commit message 是否符合格式。

它的安装是手动的。首先,拷贝下面这个JS文件,放入你的代码库。文件名可以取为validate-commit-msg.js。

接着,把这个脚本加入 Git 的 hook。下面是在package.json里面使用 ghooks,把这个脚本加为commit-msg时运行.

"config": {
  "ghooks": {
    "commit-msg": "./validate-commit-msg.js"
  }
}

然后,每次git commit的时候,这个脚本就会自动检查 Commit message 是否合格。如果不合格,就会报错。

$ git add -A 
$ git commit -m "edit markdown" 
INVALID COMMIT MSG: does not match "<type>(<scope>): <subject>" ! was: edit markdown

3. conventional-changelog

如果你的所有 Commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成。

生成的文档包括以下三个部分。

- New features
- Bug fixes
- Breaking changes.

每个部分都会罗列相关的 commit ,并且有指向这些commit的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容。

conventional-changelog 就是生成 Change log 的工具,运行下面的命令即可。

$ npm install -g conventional-changelog
$ cd my-project
$ conventional-changelog -p angular -i CHANGELOG.md -w

上面命令不会覆盖以前的 Change log,只会在CHANGELOG.md的头部加上自从上次发布以来的变动。

如果你想生成所有发布的 Change log,要改为运行下面的命令。

$ conventional-changelog -p angular -i CHANGELOG.md -w -r 0

为了方便使用,可以将其写入package.json的scripts字段。

{
  "scripts": {
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -w -r 0"
  }
}

以后,直接运行下面的命令即可。

$ npm run changelog

(完)

以上内容仅代表作者自己的个人观点,欢迎广大专业人士提出建议

Thank You!!