你可能会忽略的 Git 提交规范

一、为什么需要规范?

  • 无规矩不成方圆,编程也一样。
  • 如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你。可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项目就被糟践了。不管是开发还是日后维护,都将是灾难。
  • 这时候,有人提出了何不统一标准,大家都按照这个标准来。于是 ESLint,JSHint 等代码工具如雨后春笋般涌现,成为了项目构建的必备良品。
  • Git Commit 规范可能并没有那么夸张,但如果你在版本回退的时候看到一大段糟心的 Commit,恐怕会懊恼不已吧。所以,严格遵守规范,利人利己。

二、具体规则

先来看看公式:

<type>(<scope>): <subject>

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

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

scope

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

subject

  • 是 commit 目的的简短描述,不超过50个字符。
  • 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
  • 第一个字母小写
  • 结尾不加句号(.)

三、异常处理

我们先来看看这个异常提醒:

INVALID COMMIT MSG: does not match "<type>(<scope>): <subject>" ! 
jartto:fix bug 

这里之所以报出这个警告,是因为我的提交出现了两个问题:

  • 其一,使用了规范外的关键字;
  • 其二,很细节的问题,jartto:后少了空格;
  • 这时候我才回忆起来,当时提交一直失败,情急之下直接强制提交,所以以后的提交都会抱出这个异常。大致意思就是:
  • 你的之前的 Commit 不合格~你的之前的 Commit 不合格~你的之前的 Commit 不合格
  • 这时候就很烦了,我们只能去将之前的错误修正,那么如何操作呢?

四、如何修改之前的 commit 信息?

其实并不复杂,我们只需要这样做:

1、将当前分支无关的工作状态进行暂存

git stash 

2、将 HEAD 移动到需要修改的 commit 上

git rebase 9633cf0919^ --interactive

3、找到需要修改的 commit ,将首行的 pick 改成 edit
4、开始着手解决你的 bug
5、 git add 将改动文件添加到暂存
6、 git commit –amend 追加改动到提交
7、git rebase –continue 移动 HEAD 回最新的 commit
8、恢复之前的工作状态

git stash pop

大功告成,是不是想把整个 Commit 都修改一遍,逃~

五、项目中使用

这时候问题又来了,为什么我提交的时候会有警告,这个又是如何做到的呢?
这时候,我们需要一款 Node 插件 validate-commit-msg 来检查项目中 Commit message 是否规范。

1、首先,安装插件:

npm install --save-dev validate-commit-msg 

2、使用方式一,建立 .vcmrc 文件:

{ 
  "types": ["feat", "fix", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore", "revert"], 
  "scope": { 
    "required": false, 
    "allowed": ["*"], 
    "validate": false, 
    "multiple": false 
  }, 
  "warnOnFail": false, 
  "maxSubjectLength": 100, 
  "subjectPattern": ".+", 
  "subjectPatternErrorMsg": "subject does not match subject pattern!", 
  "helpMessage": "", 
  "autoFix": false 
} 

3、使用方式二:写入 package.json

{ 
  "config": { 
    "validate-commit-msg": { 
      /* your config here */ 
    } 
  } 
}

4、可是我们如果想自动使用 ghooks 钩子函数呢?

{ 
  … 
  "config": { 
    "ghooks": { 
      "pre-commit": "gulp lint", 
      "commit-msg": "validate-commit-msg", 
      "pre-push": "make test", 
      "post-merge": "npm install", 
      "post-rewrite": "npm install", 
      … 
    } 
  } 
  … 
}

在 ghooks 中我们可以做很多事情,当然不只是 validate-commit-msg 哦。
更多细节请参考:https://github.com/conventional-changelog-...

六、Commit 规范的作用

  • 1、提供更多的信息,方便排查与回退;
  • 2、过滤关键字,迅速定位;
  • 3、方便生成文档;

七、生成 Change log

正如上文提到的生成文档,如果我们的提交都按照规范的话,那就很简单了。生成的文档包括以下三个部分:

New features
Bug fixes
Breaking changes.

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

npm install -g conventional-changelog 
cd jartto-domo 
conventional-changelog -p angular -i CHANGELOG.md -w

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

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

这样,使用起来就很简单了:

 npm run changelog

你可能不太会用的 10 个 Git 命令

检查

先了解一下如何检查改动痕迹。

  • git diff——查看所有本地文件的改动。只改动一个文件的话可以在命令后添加文件名。
  • git log——查看所有提交历史。还可用于带有 git log –p my_file 的文件,输入 q 退出。
  • git blame my file——了解谁在什么时候对 my_file 做了什么样的改动。
  • git reflog——显示本地代码库 HEAD 的更改日志。这个命令很适合查找丢失的工作。

    用 Git 进行检查并不麻烦。相比之下,Git 中有不少删除和撤销提交以及文件改动的操作。

撤销

可以用 git reset、git checkout 和 git revert 撤销在代码库中所做的改动,这些命令可能有点难理解。

git reset 和 git checkout 既可用于提交也可用于单个文件的修改,而 git revert 只能用在提交层面。如果你只需要处理尚未合并到协作远程工作的本地提交,你可以使用这三者中任何一条命令。如果是协同工作且需要撤销远程分支中的提交,那么就用 git revert。

git reset –-hard HEAD——撤销最近提交以来暂存区和非暂存区的改动。
git checkout my commit——从 my_commit 中撤销非暂存区的改动。
git revert my commit——撤销 my_commit 中的更改。当用 revert 撤销改动时,它会产生新的提交。

注:

之前得帖子有很多的不规范,大家尽管提意见,我一定改正,谢谢.抱拳

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
讨论数量: 6

很棒!赞~(≧▽≦)/~

5年前 评论
npm install -g conventional-changelog
+ conventional-changelog@3.0.6
added 135 packages in 9.204s
conventional-changelog -p angular -i CHANGELOG.md -w
bash: conventional-changelog: command not found

?

5年前 评论
Elijah_Wang

Note:

关于commit信息的修改,值得留意的是,已提交至远程仓库的commit信息就不建议修改了(将错就错吧,开心就好, :joy: ),否则,你会发现,因为对应分支的hash签名不一致,本地分支与远程分支将无法同步。即:正常情况下,远程分支已有的commit信息是不太容易修改的。本文提及的commit信息修改方法,更适用于本地分支操作。

5年前 评论

10年前的老项目了解一下,已经维护了10年了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!