写在前面

对一个developer来说,有时候变量命名,提交代码时的提交信息会让人很头疼,本文主要聊聊怎么优雅的书写commit message。

一  你见过最奇葩的代码提交信息是什么?

曾在上家公司的一个项目中,见过我至今以来见过最奇葩的代码提交信息,让我至今难忘。那个项目的前三个commit记录的提交信息分别是

First BloodDouble killTriple kill

简直让人啼笑皆非,不知道那位仁兄是不是在一边写代码一边开黑。你是否也见过什么样的奇葩的commit message呢?!

这样的提交信息,不仅无法告知其他人之前提交了什么内容,而且会让觉得很不认真很不专业。

那规范的commitmessage能给我们带来哪些好处呢?

二  规范commit message的好处

1.可读性好,根据commit信息就能明确知道本次提交的修改内容及影响范围

2.可以根据不同的提交类型,过滤掉不想关注的提交,提高效率

3.可以自动化生成changeLog,甚至可以自动更新语义话的版本

4.可以降低codereview的沟通成本

5.一份清晰规范的commit messge,可以让你表现的更专业

那么什么样的commit message才算是好的呢?我们来看看在业界被很多人认同的两种提交风格。

三  Angular规范

Angular 的commit信息由标题,正文和页脚三个部分组成,每个部分中间通过空行分隔。标题部分包括类型,范围和主题三个部分。

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

type 提交类型

提交的类型必须是下面的一个:

feat:增加一个新功能

fix:修复bug

docs:只修改了文档

style:做了不影响代码含义的修改,空格、格式化、缺少分号等等

refactor:进行代码重构,既不是修复bug,也不是新功能的修改

perf:改进性能的代码

test:增加测试或更新已有的测试

chore:构建或辅助工具或依赖库的更新

scope 范围

说明当前提交的代码影响的范围,如果当前更改影响的不止一个范围时,可以使用*

subject 描述

包含对变更的简洁描述: 使用祈使句,现在时态:"change"而不是"changed"或"changes",第一个字母不要大写, 末尾没有点(.)

body 正文

使用祈使句,body应该包括为什么修改,具体修改了哪些了东西。

footer 页脚注释

用来放置 Breaking Changes 或 Closed Issues

四  Conventional Commits 规范

基于Angular的提交规范衍生出的规范,很大程度上以其为Augular的规范为依据

提交格式与Augular基本一致

<type>[optional scope]: <description>
[optional body]
[optional footer]

 

type 提交类型

类型是必须提供的,且必须是名词,其后接一个可选的作用域字段,以及一个必要的冒号(英文半角)和空格;

提交新功能或新特性时,必须使用feat类型;

修复了 bug 时,必须使用fix类型;

可以使用 feat 和 fix 之外的类型;

scope 范围

作用域必须是一个描述某部分代码的名词,并使用圆括号

description 描述

描述是必须项,字段必须紧接在类型/作用域的空格之后。描述指的是对代码变更的简短总结

body 正文

正文可可选的,如果书写必须起始于描述字段结束的一个空行后

footer

正文结束的一个空行之后,可以编写一行或多行脚注

BREAKING CHANGE

不兼容更新必须标示在正文区域最开始,或脚注区域中某一行的开始,必须包含大写的文本BREAKING CHANGE,后面紧跟冒号和空格。

在 BREAKING CHANGE: 之后必须提供描述,以描述对 API 的变更。例如:BREAKING CHANGE: environment variables now take precedence over config files.

可以在类型/作用域前缀之后,: 之前,附加 ! 字符,以进一步提醒注意不兼容变更。当有 ! 前缀时,正文或脚注内必须包含 BREAKING CHANGE: description

Conventional Commits规范是和SemVer规范(语义化版本)的约定是吻合的。

SemVer 是一套语义化版本控制的约定,定义的格式为 X.Y.Z主版本号.次版本号.修订号):

X.主版本号:进行不向下兼容的修改时,递增主版本号

Y.次版本号: 做了向下兼容的新增功能或修改

Z.修订号:做了向下兼容的问题修复

Conventional Commits规范是和SemVer规范相吻合的目的是什么呢?!

我们可以根据commit的类型去自动化的生成语义化的版本。

我们比较熟知  electron 项目就采用了Conventional Commits规范,其他采用了这套规范的开源项目还有:

yargs:广受欢迎的命令行参数解析器。

istanbuljs:一套为 JavaScript 测试生成测试覆盖率的开源工具和类库。

uPortal-home 和 uPortal-application-framework:用于增强 Apereo uPortal 的可选用户界面。

massive.js:一个用于 Node 和 PostgreSQL 的数据访问类库。

scroll-utility:一个居中元素和平滑动画的滚屏工具包实例。

Blaze UI:无框架开源 UI 套件。

Monica:一个开源的人际关系管理系统。

五  相关工具

有了规范是好事,但不想记那么多的type怎么办?又怎么保证团队每个成员真的按照规范去执行呢?这些都可以通过工具来解决。

Commitizen

一款帮助我们按照规则去提交提交代码的懒人工具,它是一个通用的工具,提供了多种commit Message风格可以选择,比如我们上面提到的Conventional规范,就可以通过按照 cz-conventional-changelog 来实现。

除了提供了一些可选的风格,还支持根据已有的规范去更改创建一套属于自己团队的风格配置。

安装:

npm install commitizen -g

选择风格:

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

or

commitizen init cz-conventional-changelog --yarn --dev --exact

提交代码时,使用git cz 代替 git commit,每一步都会有提示,保证按照规范提交。

commitlint

commit message 的 linter,用来对 message 进行检查,防止提交了不符合规范的提交信息。

可以结合 git hooks 在提交commit时进行自动检查,不符合规范的commit不允许提交。

同样的,commitlint也支持配置安装不同风格的配置,同时,你也能够发布并使用自己的配置。

安装:

npm install --save-dev @commitlint/{config-conventional,cli}

配置风格

echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js

结合git hooks使用

先安装husky

npm install --save-dev husky

package.json中增加配置

{
"husky":{"hooks": {"commit-msg": "commitlint -E HUSKY_GIT_PARAMS" }       }
}

这样在输入不符合风格的commit Message会无法通过,并会给出具体的提示。

standard-version

standard-version需要使用Conventional Commits规范,能够帮助自动生成符合SemVer规范的版本和 CHANGELOG。

安装:

npm i --save-dev standard-version

package.json中增加配置:

{"scripts": {"release": "standard-version" }}

第一次发布版本,执行命令,同时生成changeLog

npm run release -- --first-release

之后版本变更,直接执行

npm run release

六  常见问题

一次提交多种类型怎么操作

尽可能拆分的task,每完成一部分就进行一次提交,避免一次提交过多的代码。这样能够避免一次commit修改过多文件,导致后续的维护,回退等的困难。

如果真的有这样的提交,可以选择最重要改动的type,在body部分详细写明具体的改动。

提交了不规范的信息怎么处理

如果使用了Commitizen或commitlint,基本上可以保证提交符合规范的Message,但是也可能出现选错了类型的问题,比如是新增的功能,但是一手抖,选成了fix并完成了commit,这时可以使用 git rebase -i 来编辑提交历史。

参考

Angular规范:https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#commits

Conventional Commits 规范: https://www.conventionalcommits.org/en/v1.0.0-beta.4/

SemVer规范: https://semver.org/

- 更多干货文章 -

你见过最奇葩的代码提交信息是什么?别再为写commit message头疼了!相关推荐

  1. Gitlab+P3C-PMD(阿里云插件)标准化你团队的代码和提交信息

    1.背景简介 项目越来越大,代码越来越多,然后就是各种五花八门的代码格式.代码规范.可用自查或者交叉检查,但是都是人工需要费事费力,还不一定能面面俱到,所以必须有一种强制的手段,不折不扣的执行代码规范 ...

  2. Git 提交的正确姿势:Commit message 编写指南

    Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交. $ git commit -m "hello world" 上面代码的-m参数,就是用来 ...

  3. 修改最后一次commit提交信息

    转自:http://www.softwhy.com/article-8492-1.html amend翻译成中文具有修订和改良的意思. git commit --amend可以修订最后一次commit ...

  4. 如何用TortoiseGit小乌龟来进行代码提交(亲测版)

    这里是公众号:自学编程村,自学编程不迷路.欢迎关注我,可以一起交流~~~ . 关注方式见主页或文章底部.想要加群可从公众号中加我wx 我们本次主要来介绍如何使用TortoiseGit的GUI图形化界面 ...

  5. git将代码提交到多个远程仓库

    在项目目录下执行: git remote set-url --add origin http://mayun.cn/xxx/adsdsdsdcelery-demo.git 即可添加一个远程仓库. 再执 ...

  6. Eclipse svn代码提交冲突

    Eclipse svn代码提交冲突(转) 1.Synchronize视图下查看代码冲突 1.Incoming Mode 全部update,更新到本地 2.Outgoing Mode 全部commit, ...

  7. git中统计代码提交数

    git中统计代码提交数 通过git log来取 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5

  8. linux 代码统计工具,Shell脚本实现的基于SVN的代码提交量统计工具

    最近没啥事,就用bash写了一个基于svn的代码统计小工具. 可以指定统计的目录,默认递归统计子目录. 目前还没有屏蔽指定目录的功能.哈 代码比较粗糙.不过先晒出来. #!/bin/bash - #& ...

  9. SVN版本管理工具使用中常见的代码提交冲突问题的解决方法

    相信刚开始学习使用SVN的小伙伴在项目合作开发的过程中一定经常遇到一些影响到自己编写的代码的苦恼,我这里列举了几种常见的问题以及问题的解决方法: 1.误删除和误操作的问题 问题1:有A和B两个人一块合 ...

最新文章

  1. 用Docker安装Gitlab
  2. Java事务(转载)
  3. 操作系统回忆录:进程、线程、资源调度
  4. [jquery]if条件句
  5. Python实现根据图片进行着色的词云
  6. (整理)ubuntu10.10安装低版本的编译器(低版本)(gcc)(ubuntu)
  7. MFC遍历指定目录下的所有文件/文件夹(不遍历子目录)
  8. .流程引擎对接的三种方式_02
  9. rabbitmq可靠性投递_阿里Java研发二面:了解RabbitMQ?说说RabbitMQ可靠性投递
  10. RPC调用链通信方法
  11. java 过滤器 怎么创建_java如何创建过滤器
  12. JMX configuration for Tomcat
  13. dcopserver出错解决办法
  14. OAuth 2 开发人员指南(Spring security oauth2)
  15. python学习——python平台搭建
  16. 从零开始,学习web前端之HTML5
  17. Node.js十年,你大爷还是你大爷
  18. Java网络编程笔记
  19. @Autowired的基本使用
  20. SpringCloud:统一网关Gateway

热门文章

  1. Scrapy爬取斗破苍穹漫画
  2. [源码阅读]VDO-SLAM笔记[1] Track()中动态obj部分
  3. java mail 附件 dat,邮件附件winmail.dat文件的正确打开姿势
  4. 用c语言实现一个简单的计算器(数据结构)
  5. 一文教你懂得什么什么是EMC(电磁兼容)
  6. 淘宝拆分关键词规定 淘宝关键词拆分优化方法
  7. Spring Boot入门教程(四十六): @Async
  8. 墨客开发者行动(上海站)
  9. 计算机毕业设计-基于SSM+Vue的公交路线管理系统-java公交管理系统代码
  10. 如何彻底卸载SQL Server 2008