百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

程序员必读:Git提交信息和分支创建规范

bigegpt 2024-10-29 13:00 8 浏览

为什么要制定规范

古话说,没有规矩不成方圆。在团队协作开发时,每个人提交代码时都会写 commit message,但如果没有规范,每个人都会有自己的书写风格,因此在翻看 git log 时经常看到的是五花八门,十分不利于阅读和维护。

通过下面两个例子来看看没规范和有规范的对比,以及有规范能带来哪些好处。

提交信息 没规范 vs 有规范

从这个提交信息里你不知道他修改了什么,修改意图是什么。

这是 Angular 的提交信息,它遵循了 Conventional Commits[1],直译过来为常规提交。

这也是行业内使用最为广泛的 Git 提交信息规范,已经有不少的项目在使用,如果你的项目还没有制定 Git 提交信息规范,建议照搬或参考这个规范来制定。

对于一个团队,当很多人在一起合作开发一个项目的时候,预先制定好提交信息规范,对于项目的长远发展以及后续人员加入和维护都非常有帮助。

总结有以下几个好处:

  1. 有助于他人更好的理解你的变更意图,更容易贡献/修改代码。
  2. 结构化的提交信息有助于自动化脚本的识别和 CI/CD。
  3. 提供自动化生成 CHANGELOGs 的能力。
  4. 最后,这也是体现了一个程序员的自我修养。

分支创建 没规范 vs 有规范

如果创建分支没有规范,不加以限制,很多分支会是这样的 ABC-1234-Test, ABC-2345-demo, Hotfix-ABC-3456, Release-1.0,甚至更糟。当分支很多的时候会显得混乱,并且不方便检索。

如果制定分支创建规范,比如上面的分支在创建时,通过 Hook 强制限制分支开头必须以类型开始,那么新创建的分支将会是这样的:bugfix/ABC-1234, feature/ABC-2345, hotfix/ABC-3456, release/1.0 这不但有助于检索,还方便他人通过类型了解分支用途,以及方便后续的 CI/CD 流水线的开发。

如何解决规范问题

应该从两方面着手:

  • 首先,为团队制定提交信息以及创建分支规范,让团队成员了解规范并遵守。
  • 然后,在提交代码或创建分支时,通过设置的 Git Hook 将不规范的禁止提交到远程仓库。

制定Git提交信息规范

制定合理的规范,最有效的方法是参考软件行业里是否有通用的规范。目前行业最为广泛规范是 Conventional Commits[1] 很多项目包括 Auglar 也在使用。

可以根据以上规范制定适合自己团队的规范,例如:

JIRA-1234 feat: support for async execution

^-------^ ^--^: ^-------------------------^
|         |     |
|         |     +--> Summary in present tense.
|         |
|         +--> Type: feat, fix, docs, style, refactor, perf, test or chore.
|
+--> Jira ticket number

Type 类型必须是下面之一,并且为小写:

    feat: 修改/增加新功能
    fix: 修改bug的变更
    docs: 文档相关变更
    style: 不影响代码含义的变更(空白、格式、缺少符号等)
    refactor: 代码重构变更
    perf: 改进性能的变更
    test: 添加/修改现有的测试
    chore: Build, .gitignore或辅助工具、库(如文档生成)等变更

设置 Git Hooks

这里以 Bitbuket 为例,其他 Git 工具比如 GitHub,Gitlab 都有类似的功能。

Bitbucket 使用的是 Yet Another Commit Checker[2] 这个免费插件。

首先,开启 Yet Another Commit Checker。


然后逐一介绍 Yet Another Commit Checker 的一些常用的设置。


1. 开启 Require Valid JIRA Issue(s)

开启这个功能,在提交信息的时通过 Hook 自动验证是否有 Jira 单号,单号是否存在。如果是否定的,提交失败。这样就强制在提交代码时 commit message 与 Jira 单号进行关联。

2. Commit Message Regex

比如设置一个这样简单的正则表达式 [A-Z\-0-9]+ .* ,这要求 Jira 单号必须以这种格式 ABCD-1234 开头,并且描述信息要与 Jira 单号之间留一个空格。

通过以上设置,就将提交信息限定为如下格式:

ABCD-1234 Balabala......

再比如这个更为复杂的正则表达式,如下

^[A-Z-0-9]+ .*(?<type>chore|ci|docs|feat|fix|perf|refactor|revert|style|test|Bld|ˉ\\_\(ツ\)_\/ˉ)(?<scope>\(\w+\)?((?=:\s)|(?=!:\s)))?(?<breaking>!)?(?<subject>:\s.*)?|^(?<merge>Merge.* \w+)|^(?<revert>Revert.* \w+)

这个正则表达式不但限制了开头必须以 JIRA 单号开始,中间有一个空格,还必须在描述信息里填写 type 类型,最后才是描述信息。另外还支持如果是如果是 Merge 或是 Revert 会产生其他的描述信息。

通过下面的测试用例来具体理解上述的正则表达式会产生什么样的提交信息规范限制。

# 测试通过的用例
NV-1234 chore: change build progress
DT-123456 docs: update xdemo usage
QA-123 ci: update jenkins automatic backup
CC-1234 feat: new fucntional about sync
Merge branch master into develop
Reverted: Revert support feature & bugfix branches build
Merge pull request from develop to master

# 测试不通过的用例
NV-1234 build: update
NV-1234 Chore: change progress
DT-123456 Docs: update xdemo
QA-123ci: update jenkins automatic backup
CC-1234 Feat: new fucntional about sync
DT-17734: 8.2.2 merge from CF1/2- Enhance PORT.STATUS
DT-17636 fix AIX cord dump issue
DT-18183 Fix the UDTHOME problem for secure telnet
DT-18183 Add new condition to get UDTHOME
DT-15567 code merge by Peter Shen.

测试结果也可以在这里 https://regex101.com/r/5m0SIJ/10 找到。

建议:如果你要在你的 Git 仓库里也要设置这样严格并且复杂的正则表达式,建议一定要经过充分的考虑和测试才把它正式放入你的 Git 仓库的 Hooks 设置中。

3. Commit Regex Error

这个设置是用来提示错误信息的。当团队成员在提交时,如果不符合规范提交失败了,会给出合理的提示信息,这有助于找到问题所在。比如提交失败了,会在命令行里看到如下信息:

Commit Message Specifications:

<Jira-ticket-number> <type>: <Description>

Example:

ABC-1234 feat: Support for async execution

1. Between Jira ticket number and type MUST has one space.
2. Between type and description MUST has a colon and a space.

Type 类型必须是下面之一,并且为小写:

feat: 修改/增加新功能
fix: 修改bug的变更
docs: 文档相关变更
style: 不影响代码含义的变更(空白、格式、缺少符号等)
refactor: 代码重构变更
perf: 改进性能的变更
test: 添加/修改现有的测试
chore: Build, .gitignore或辅助工具、库(如文档生成)等变更

根据这个描述信息,提交者就能很容易知道正确的规范是什么样子的,然后通过 git commit --amend 命令对自己最近一次提交信息做出修改。

4. Branch Name Regex

这个是对创建分支时做出的规范限制。在设置了相应的正则表达后,开发在创建分支时,只有符合正则表达式的条件才可以推送到远程仓库中。

例如这个创建分支的正则表达式 ^(bugfix|feature|release|hotfix).*|(master)|(.*-dev)

这里限制了所有的分支必须以 bugfix, feature, release, hotfix 开头或是也可以这样的 v1.0-dev 这种类。

你可以根据上面的正则表达式来设计属于自己项目的分支正则表达式。

5. Branch Name Regex Error

这个设置是提示推送不规范的分支时的错误信息。预先设置好相应的错误提示信息,有助于用户快速找到推送失败的原因。比如下面的错误信息:

Branches must begin with these types: bugfix/ feature/ release/ hotfix/

告诉用户,分支必须以 bugfix/ feature/ release/ hotfix/ 开头。

6. 其他设置

另外还有一些其他设置,比如关联的 Jira 单子必须处于什么样的状态。这个可以防止已经是关闭状态 Jira 单子,开发还往上面偷偷的提交代码,这样可能导致未经测试的代码进入仓库。

还有 Require Matching Committer Email 和 Require Matching Committer Name 来限定开发者必须配置好与登录用户名和邮箱相匹配的用户名和邮箱,来规范提交信息里显示的用户名和邮箱,也方便进行 Git 信息的统计等后续数据的收集。

参考资料

[1] Conventional Commits: https://www.conventionalcommits.org/en/v1.0.0/

[2] Yet Another Commit Checker: https://mohamicorp.atlassian.net/wiki/spaces/DOC/pages/1442119700/Yet+Another+Commit+Checker+YACC+for+Bitbucket

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...