shadowfish和他的代码

vuePress-theme-reco shadowfish    2020 - 2023
shadowfish和他的代码

Choose mode

  • dark
  • auto
  • light
时间轴

shadowfish

49

Article

42

Tag

时间轴

用Commitizen实现优雅规范的commit风格

vuePress-theme-reco shadowfish    2020 - 2023

用Commitizen实现优雅规范的commit风格

shadowfish 2022-04-29 工程化Commitizen

做项目开发有一段时间了,作为leader肯定是经常给团队成员讲,commit信息不能乱写,要突出这次提交修改了什么,同时最好一个功能一个commit,不要全混在一起。然而,执行中大家往往习惯写出这些commit:

  • 修复BUG(到底修复什么BUG?)

  • 调整了xx业务的逻辑(到底调整了什么逻辑?)

  • xxx业务改了啥啥啥;yyy业务改了啥啥啥....(冗长的描述,明明可以分开commit的)

  • ...

说实话,我自己写代码都真的在commit规范上做的很差。很多时候,除了写出上面列出的反例,对于个人项目甚至都懒得搞git管理。

究其原因,其实还是因为懒。commit信息要写好,还是需要一些心智成本的,有时候代码呼呼写,实在是不愿意停下来想想给刚才写好的东西commit存个档,直接接着下一个业务继续开撸了。

最近筹划做个自己的开源项目,想要从各种方面好好规范自己的编程习惯,在commit这块上必然是少不了,因此决定好好学学Angular提交规范 。

# Angular提交规范

首先来快速了解一下在Angular风格下,要怎么编写commit message。

开始之前普及一个热知识,git中commit message是允许多行书写的。

Angular风格规定commit message必须遵循如下格式:

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

也就是三大块内容:首行(必须),详情(可选),脚注(可选)。

# 首行

首行文本的作用是简明扼要地描述这个commit到底干了什么事。它由三个部分组成:类型type(必须),范围scope(可选),描述subject(必须)

# 类型

有如下几种类型可选:

  • build:影响构建系统、外部依赖的改动

  • ci:更改自动集成(CI)相关文件、脚本的改动

  • docs:文档的改动

  • feat:添加了新的功能

  • fix:修复了BUG

  • pref:性能优化类型的改动

  • refator:代码重构,这种改动理应对程序原逻辑无影响

  • test:对测试代码的改动

# 范围

描述这次更改改了啥地方,比如改了某个文件、某个函数...

# 描述

简明扼要地描述这次更改,不要写太长。

# 详情

首行后面空一行,再跟着可以写详情。详情中,可以写这个为啥你会进行这个更改、这个更改会带来的变化和与之前逻辑的变化。如果是比较简单的更改,这个部分可以省略。

# 脚注

详情后面空一行,再跟着可以写脚注。脚注中,如果更改是重大的,不向后兼容(Breaking Changes)的,就应该写在这里,格式应该是以BREAKING CHANGE:开头,紧跟一个空格或者再空一行,再详细描述这个重大更新带来的影响。

另外,脚注也可以用来标记这个更新对应的issues。


还有一些英语语法上的规范,这里就不列出了,让我们来试几个例子:

  1. 我要修改readme文件,那我的commit应该是:

    docs(readme):readme加上了作者名字
    
  2. 我加了一个新功能,那我的commit应该是:

    feat(user):添加用户注销功能
    
    用户注销后,数据库数据不会删除,仅做注销标记,后续对用户进行的其他查询应对此进行过滤处理
    
  3. 我修复了热心群众提的1234号issue bug,那我的commit应该是:

    fix(user):修复用户注销失败的BUG
    
    之前注销失败是因为没有考虑用户email空的情况,现在就算用户没有email也可以注销成功
    
    Fixes #1234
    

可以看出,规范化的commit格式可以让项目git提交记录看起来和读书一样优雅美观,看一眼首行就可以知道这次更改的类型、干了啥,点开看看详情可以快速掌握这次更改需要知道的其他信息。

不过,规范学起来不太容易,一开始需要记忆定义的这些类型名字和他们对应的意义,有些不方便,能不能更加优雅一些?

说起这个,很多程序员的DNA应该就动了,优(偷)雅(懒)应该是大家的共同追求吧:)

我们可以借助commitizen 来解决这个问题。commitizen为上述流程提供了交互式的执行方式,不需要记忆规范内容,只需要按它的提示选择、编写就行。

# commitizen

首先来安装commitizen。

设置镜像解千愁:

npm config set registry https://registry.npmmirror.com

全局安装commitizen:

npm install -g commitizen

然后初始化当前项目,以适配commitizen的配置:

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

完成后,执行

cz

即可进入commitizen交互式环境,一步步选择、编写规范的commit message。

执行前,要先把待提交的代码加入git stage,如果跟着commitizen写完了message但是stage是空的,那你就得重写一遍message了!最简单的把所有修改过的文件加入stage的命令:

git add .

这是我摸索完,体验的效果,感觉就是非常优雅!