当前位置:首页 > 技术文章 > 一篇总结很全面的Git使用提交规范!

一篇总结很全面的Git使用提交规范!

go1233小时前技术文章3

「要说git规范的作用,虽然决定不了你的上限,但完全能拉低你的技术影响力。」 好的git规范不仅让人看起来赏心悦目,在排查紧急问题时也能达到事半功倍的效果。

最近刚入新项目,线上出了一个bug,Leader让排查。相关代码稍显复杂,想看看git历史记录获取些线索,打开Git Graph一看,当场石化,一堆像task/10001hotfix/0910experimental/performance_web-workertest1test2命名的分支,提交描述如实现10001需求修复线上bug, 这不都是git规范的反面教材吗?作为一个"砖家",我不得不写一篇Git规范,让组员看看什么叫professional

为了缓解石化,看看开源项目的分支命名,看着是不是就比较规范?虽然分支格式有些差异,但都能看出分支要实现的功能或要解决的问题。

vue3分支:


element-plus分支:

分析这些开源项目的分支命名,不难发现,Git规范没有标准答案,只有适合、不适合。其目的是让项目分支保持风格统一, 提升易读性, 降低跟踪成本。 本篇内容将从分支流程、分支命名、commit、辅助工具等四个方面介绍。

分支开发规范

Workflow

当实现新功能或者解决线上问题时,需要创建对应的分支并开发,从开发到测试、发布、上线、问题修复等各个环节,如果没有合理的规范约束,当需要回退、急救问题修复或者跟踪排查时,将会让你事倍功半。对于分支开发规范,就以业界常用的git-flow工具来说,一个Feature从开始到上线结束需要经过如下的流程,element-plus也是采用这样的workflow。


「项目主要使用main、develop两个分支来记录git的历史」main作为production的发布历史分支,例如上线时会基于main发布v0.1、v0.2;develop作为持续集成的分支,当功能分支feature开发完成后会merge到dev并提交测试流程。

develop分支功能测试完毕,准许进入预发阶段,需要依据develop分支创建一个发布阶段使用的release分支,为了能支持多个功能并行开发,release分支可命名为release/0.1.0

「当预发阶段发现任何bug,直接在release分支上修改。当需要上线时,除了将release合并到main分支,特别要注意的是,还需要将其合并到develop,随时让develop保持最新代码。使用main发布正式版本的同时会打tag,如v1.0v2.0。」

如果遇到线上问题,「需要紧急解决,则直接从main拉取hotfix分支」,hotfix也是除了develop外还会从main拉取代码的分支。「当问题解决完了,需要将其同时merge到main和develop分支」

辅助工具

问题:

  • 「每一次上线,会创建feature、release、hotfix等分支,时间长了会不会有一大推历史分支?」

  • 「这么一套流程,如果都手动创建分支,会不会太繁琐了?」

「这些问题完全可以丢给git-flow、gitflow vscode extension解决」,可交互式创建feature、hotfix分支,开发人员只用关注需要创建的分支即可,流程控制可交给工具管理。

研发规模稍微大点的公司,一般都会有CI/CD,因此也可以将gitflow流程直接集成到CI/CD。

开源CI/CD平台:国内使用比较多的是JenkinsGitLab

  • 「Jenkins」 Jenkins是开源CI/CD工具中的佼佼者,咱公司就在用

  • 「GitLab CI」 开源免费,支持私有化部署

  • 「GitHub Action」 优点是和GitHub集成,缺点是代码服务在国外,并且不支持私有化部署

  • 「Tekton」 优势在于非常灵活,用户可以通过自定义 Task 来完成 Pipeline 的编写,但上手成本比较高

分支命名规范

通用分支命名

查看vue和element-plus分支,一般都有feat、fix、perf等作为分支前缀,业界通用的前缀有:

  • feat:新功能

  • fix: 问题修复

  • refactor: 涉及代码重构,一般和新功能、问题修复无关

  • perf: 和性能相关的改造,如perf/table用来优化table展示性能

  • chore: 构建或辅助工具调整,如chore/upgrade-vite

除此之外,部分开源项目也允许以人名作为前缀,例如evan/fix-jsx-dom-augmentation

假如现在有新需求:实现一个支持无限加载的list组件,JIRA单号为1000,怎么命名分支?

  • 可以是:feat/1000-list-dynamic-loading

  • 也可以是:feat/1000_list_dynamic_loading

  • 还可以是:

    • evan/feat-list-dynamic-loading-1000

    • evan/feat_list_dynamic_loading_1000

  • 如果没有Jira编号,则可以为:

    • feat/list-dynamic-loading

    • evan/feat-list-dynamic-loading。

个人觉得将人名作为前缀,分支名稍显冗长,不如以feat等type作为前缀来的直接、清晰,开发者信息完全可以根据提交记录跟踪。因此,「功能分支命名建议:以feat作为前缀,分支名由多个单词按确定性、重要性排列,由"-"分隔,不超过4个单词。例如feat/1000-types-vnode-hooksfeat/v-model-dialog

上线后发现问题,测试人员提了bug,单号为2000, 问题是内容没有对齐,修复问题的分支如何命名?

  • 以问题单号开头

    • fix/2000-list-style-align

    • fix/2000_list_style_align

  • 没有问题单号

    • fix/list-style-align

    • fix/list_style_align

虽然开源项目很多以人名作为前缀,但不建议,一方面冗长,另一方面不够直观,例如evan/list-style-align,如果加上单号和问题标识,则变为evan/fix-list-style-align-2000就稍显冗长。

因此,「问题类分支命名建议:以fix作为前缀,分支名由多个单词按问题范围从小到大的单词排列,由-分隔,不超过4个单词。例如fix/2000-menu-default-openedfix/eslint-config-vnode。」

list用了一段时间,leader提出优化list,降低内存占用,「性能优化分支如何命名?」

  • perf/list-memory-occupation

  • perf/list_memory_occupation

  • evan/perf-list-memory-occupation

「性能相关分支命名建议:以perf作为前缀,分支名由多个单词按模块(page、list、table等)、性能类型(loading、render、momory等)、优化方向进行排列。例如perf/page-render-by-skeletonperf/table-loading-lazy。」

当项目开发到前中期、模块越来越多,需要把项目拆成多包模式,「重构分支如何命名?」

  • refactor/packages

  • refactor/modules-to-packages

「重构分支命名建议:如果是对模块或组件重构,一般表明影响面即可。例如refactor/selectrefactor/docs-style-updaterefactor/ast。」

除了以上新功能、问题修复、性能优化这些方面,「其他的改动都可归属到chore类型分支,chore本身就代表琐碎、杂事。例如chore/eslint-upgradechore/vitest-ugradechore/eslint-imports。」

分支命名最重要不适非的限制使用哪一套方式,整体保持一致就行,不能像以下这样混着用:

  • feat/1000-table-component

  • feat/2000_page-loading-lazy

  • fix-list-style-align-3000

  • perf/list_memory_occupation

辅助工具

「辅助工具:validate-branch-name」,用于校验分支命名。

npm i validate-branch-name -g

.husky(装可参考下文的commit规范)下定义pre-commit文件,并添加如下内容:

#!/bin/sh. "$(dirname "$0")/_/husky.sh"# validate branch name before commitnpx validate-branch-name

package.json文件添加内容:

  "validate-branch-name": {    "pattern": "^(master|main|develop){1}$|^(feat|fix|hotfix|release|perf|refactor|chore)/.+$",    "errorMsg": "分支命名不规范,请修正!"  }

假如提交分支test-vueuse代码,执行git commit -m \'feat:添加vueuse测试用例\',则会报错:

可执行git branch -m branchName修改分支命名,再重新提交。

commit规范

代码提交规范和分支命名相关联,但比分支命名分的更加明细,大多数开源框架都采用angular.js指定的提交格式,类型包含:

  • 「feat」: 新功能

  • 「fix」: 问题修复

  • 「docs」: 文档更新

  • 「style」: 代码风格修改,例如空格处理、格式化、添加分号等等

  • 「refactor」: 新功能和问题修复除外的,代码结构、逻辑调整

  • 「perf」: 性能优化

  • 「test」: 增加或修复测试用例

  • 「chore」: 像构建脚本、辅助工具、文档生成等工程相关代码提交

代码提交信息一般由多个部分组成,分别是Type、Scope、Subject、Body、Footer, 先看下开源项目提交案例:


  • 包含Type、Scope、Subject、Footer


  • 包含Type、Scope、Subject、Body

结合上面两个案例,再来理解这几部分的含义:

  • Type:确认提交类型,如新功能feat、问题修复fix

  • Scope: 影响的package、module或者component,例如feat(compiler-doem)fix(table)

  • Subject: 提交标题,angular.js提交规则默认限制字符长度为20,建议调整到能包括主旨的长度,而不是再拆分到Body中。

  • Body:可选填,一般都不需要填写该部分,除非像上述案例,把几次内容合并提交了,在Body下标注历史提交记录。

  • Footer:开源项目使用的比较多,如果修复并提交别人提的issues,则会在Footer部分附加对应的单号,例如close #11873,github在关联issue时,可自动添加Footer信息。

所以,需要人添加的部分一般为Type、Scope、Subject即可,例如:

feat(components): [dialog] Dialog can drag overflow the viewport (#15643)feat(components): [table] add `filterClassName` props in TableColumn (#15389)test(components): [select-v2] backspace should not delete disabled tag (#15552)refactor(components): [drawer] use setup (#15556)perf( runtime-core): use `apply` to avoid spreading. (#5985)style(components): [menu] Collapse mode active color (#15343)chore: update email link in SECURITY.md (#11632) [ci skip]

当修改多包模式下的组件时,可通过Type(package):[componentName] XXXX形式提交信息,例如feat(components):[table] add header filter props

辅助工具

如果完全让人自觉遵守commit规则,这非常不现实,所以还得借助工具提供交互式和校验,如husky、commitizen、git-commit-plugin相关工具打组合拳。

  1. 「husky: 作为git hooks,能在git的多个环节添加脚本」

husky安装:

npx husky-init && npm install
  1. 安装validate-branch-name,在pre-commit添加执行命令。

npm install validate-branch-name --save-dev  npx husky add .husky/pre-commit "npx validate-branch-name"

package.json文件添加内容:

  "validate-branch-name": {    "pattern": "^(master|main|develop){1}$|^(feat|fix|hotfix|release|perf|refactor|chore)/.+$",    "errorMsg": "分支命名不规范,请修正!"  }

3.安装commitizen

npm install commitizen --save-dev

使用cz-conventional-changelog提供交互描述信息

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

安装完后,可执行czcz commitgit cz等指令唤起交互式。

  1. 安装commitlint

npm install @commitlint/config-conventional @commitlint/cli --save-dev

在项目根目录下新建文件commitlint.config.js,并添加如下内容:

module.exports = {    extends: [\'@commitlint/config-conventional\'],    parserPreset: {      parserOpts: {        issuePrefixes: [\'#\'],      },    }  }

「可根据自身需求来配置Type、Scope等信息,配置详情查看commitlint docs」

执行如下指令,在commit-msg文件添加校验指令。

npx husky add .husky/commit-msg \'npx --no -- commitlint --edit $1\'

通过上述的配置,当执行git commit时,先使用validate-branch-name检查分支名,再弹出git message交互模式。

  1. git commit唤起交互式,需要在prepare-commit-msg添加如下内容:

#!/usr/bin/env sh. "$(dirname -- "$0")/_/husky.sh"exec < /dev/tty && npx cz --hook || true

总结

git规范主要覆盖workflow、branch naming、branch commit三个环节:

  • workflow:可借助git-flow工具将分支流程串联起来,开发人员聚焦分支功能实现,目前有Jenkins、Gitlab CI等开源平台将git-flow集成到自动化流程中。

  • branch naming: 可使用validate-branch-name工具,并配置匹配规则,保证分支命名符合规则。

  • branch commit: 依赖于git hooks的husky工具,使用commitizen、commitlint来提供commit交互和验证。

「要说git规范的作用,虽然决定不了你的上限,但完全能拉低你的技术影响力。」 好的git规范不仅让人看起来赏心悦目,在排查紧急问题时也能达到事半功倍的效果。


来源:稀土掘金技术社区

原文作者:前端下饭菜

声明:本站所有内容均为自动采集而来,如有侵权,请联系删除
标签: git编码规范

相关文章

Redis连环五十二问!看谁顶得住?

Redis连环五十二问!看谁顶得住?

基本 1.说说什么是Redis? Redis是一种基于键...

用 PHP 处理 10 亿行数据!

用 PHP 处理 10 亿行数据!

今天,我将带大家一起走进“挑衅十亿行“数据的世界。当然,这个事情是依据GitHub上的一个“十亿行挑衅”(1brc)运动而来,现在正在进行,如果你没有听说过,可查看Gunnar Morlings 的 1brc 存储库。https://github.com/gunnarmorling/1brc我之所以...

2024 年的最佳 PHP 框架

2024 年的最佳 PHP 框架

在本文中,我们将预测在 2024 年持续风行的最佳 PHP 框架。我们首先将看看PHP框架是什么,什么时候该斟酌应用PHP框架,以及应用PHP框架的重要长处都是什么。我还会介绍最合适初学者的 PHP 框架以及用于 Web 开发的最佳框架。什么是PHP框架?     &...

一文读懂多家厂商的大模型训练、推理、部署策略

一文读懂多家厂商的大模型训练、推理、部署策略

4 月 20 日,第 102 期源创会在武汉胜利举行。本期邀请来自武汉人工智能研讨院、华为、MindSpore、京东云、Gitee AI 的人工智能专家,环绕【大模型竞技与性能优化】主题发表演讲。接下来就一起看看本期运动的出色瞬间吧!大合影 get ✅披萨和礼物不能少!接下来进入主题演讲回想环节。可...

请立刻停止编写 Dockerfiles 并使用 docker init

请立刻停止编写 Dockerfiles 并使用 docker init

您是那种认为编写 Dockerfile 和 docker-compose.yml 文件很苦楚的人之一吗?我承认,我就是其中之一。我总是想知道我是否遵守了 Dockerfile、 docker-compose 文件的最佳编写实践,我畏惧在不知不觉中引入了安全破绽。但是现在,我不必再担忧这个问题了,感激...

服务器为什么大多用 Linux 而不是 Windows ?

服务器为什么大多用 Linux 而不是 Windows ?

前几天在知乎看到一个话题很有意思,且很有讨论意义。“服务器为什么大多用 Linux”,除了开源、好用等原因,回答也代表了各种不同人需求和看法,摘取一些分享给大家,也欢迎留言讨论。来自知乎好友“熊大你又骗俺”的回答首先在20年前,windows server+iis+asp+access 的方案,还是...