Git

56 阅读9分钟

Git提交规范

Commitizen

知名前端web项目AngularJS的提交记录在业内被许多人称赞,其规范同时也逐渐被大家引用,为了把这些规范实际应用到项目中,我们就需要commitizen这个小工具,该工具是基于Node的,因此我们首先必须先安装node环境 ,node环境好了后便可以开始安装我们的利器。

#第一步 全局安装
npm install -g commitizen cz-conventional-changelog cz-conventional-changelog-zh

#第二步(中英文2选1)
# git cz时进行中文版提示
echo '{ "path": "cz-conventional-changelog-zh" }' > ~/.czrc
# git cz时进行英文版提示
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

#当你在终端提交git的代码时,使用命令 git cz即可弹出一个交互式页面进行规范化代码提交

交互式页面说明:
-   feat: 新增一个功能
-   fix: 修复bug
-   docs: 仅仅修改了文档或注释,比如README, CHANGELOG, CONTRIBUTE等等
-   style: 仅仅修改了空格、格式缩进等等,不改变代码逻辑
-   refactor: 代码重构,没有加新功能或者修复bug
-   perf: 优化相关,比如提升性能、体验
-   test: 测试用例,包括增加缺失用例或者修正测试用例

 

**(2)what is the scoped of this change?**

本修改影响的是内容(范围)?可以填文件名

**(3)写一个简短的介绍**

**(4)提供一个长的介绍**

**(5)本修改是否实现了某个issues?**

IDEA中使用插件

在IDEA插件市场中搜索中文版-“Commit Comment” 或 英文版-"Git Commit Template",这个插件的好处就在于,可以便捷的生成规范化的代码提交注释,并且对提交的注释进行分类,让你一眼就知道,这个提交的内容涉及哪方面。

安装完后,在提交代码的时候,Commit Changes面板的Commit Message上方,下图第二个按钮(对应英文版插件)第三个按钮(对应中文版插件),点击打开Commit Comment面板,在这里填提交注释就可以自动生成格式化的注释。

image.png

交互式页面说明

Type of change

  • feat 新增功能(新的功能、新的需求)
  • fix Bug修复(修复代码bug,测试、验收等阶段bug)
  • docs 文档修改(仅文档更改,代码注释、README等)
  • style 样式修改(不影响代码功能和逻辑的修改,CSS样式、代码格式化等)
  • refactor 代码重构(既不修复错误也不添加功能的代码更改)
  • perf 性能优化(提高性能的代码更改)
  • test 测试代码(添加缺失的测试或更正现有的测试)

Scope of this change 修改范围/模块

Short description 简要描述

Long description 详细描述

Breaking changes 重大改进(与上个版本不兼容的描述)

Closed issues 关闭/关联的问题

Git Hooks

是什么?

Hooks是提前定义的脚本程序,它们可以在git命令执行的特定时刻被触发。它是git的内置功能,在本地运行。

常用的hook有:

  • pre-commit
  • prepare-commit-msg
  • commit-msg
  • post-commit
  • post-merge
  • pre-push

实际应用中,你可能需要这样的自动化配置来解放生产力,比如:

  • 提交之前要进行提交规范检查。
  • 为了维护清晰的提交记录,检查git提交是否符合提交规范。
  • 拉取远程仓库后,可能有人添加新的依赖,使用hook可以配置在拉取之后自动安装依赖。

怎么工作?

每个git仓库都有一个hooks的文件夹,默认为.git/hooks,在特定git命令执行时被触发调用。hook脚本以非零状态码退出(exit 1)时,会终止该git命令执行。

如何实现?

在项目的 .git/hooks 目录中找到commit-msg.sample文件,去掉后缀然后用终端打开,删除里面原有的内容后将以下内容粘贴到文件中保存退出。

#!/bin/sh

MSG=`awk '{printf("%s",$0)}' $1`
if [[ $MSG =~ ^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)\(.*\):.*$ ]]
then
  echo "\033[32m 提交成功! \033[0m"
else
  echo "\033[31m 错误: 提交消息不符合规则 \033[m"
  echo "\033[31m 错误: 必须以以下之一为开头 [feat,fix,docs,style,refactor,perf,test,build,ci,chore,revert];后面括号中填写对应的模块名称,如果修改了多个模块请分多次进行提交以便后续的跟踪和维护;然后填写简短的描述 \033[m"
  echo "\033[31m 例: feat(user): 增加了用户登录 \033[m"
  exit 1
fi

当项目代码修改后进行commit提交时,如果填写的信息不符合上述要求,则会终止本次提交并输出错误提示信息

image.png

注:上述commit-msg中的正则是基于英文本插件Git Commit Template自动生成的提交信息模版进行的匹配

分支管理(小团队)

分支介绍

main 主分支

  • 所有提供给用户使用的正式版本,都在这个主分支上发布。开发者在此分支不可进行push操作

develop 开发分支

  • 日常开发所使用的分支,开发者完成的阶段性功能模块将首先被合并到此分支。

  • 此分支亦是团队内部测试、阶段性工作验证所使用的分支。

  • 开发者在此分支 不可进行 push 操作,只能通过 Pull Request 的方式将个人分支合并到此分支。开发过程中,要经常与此分支保持同步。

feature/xxx 新功能分支

  • 用于某个功能模块的开发,例如:张三创建了一个 feature/package-manager 分支负责开发包管理器模块

  • 当该功能模块开发任务完成后,通过 Pull Request 的形式进行请求合并,管理员 Code Review 通过后,将该分支合并到 dev 分支

  • 一旦完成开发,feature就会被合并进 dev 分支 (仅能通过 Pull Request 的方式),然后被删除。此类分支由开发者个人管理和使用,可选择性进行 push 操作。

  • 开发过程中,此类分支要经常与 dev 分支保持同步。

hotfix/xxx 补丁分支

  • 用于紧急修复线上Bug的分支,由master分支创建

  • 同 feature/xxx 分支一样,一旦修复工作完成,它们就会被合并进 master 或 dev 分支 (仅能通过 Pull Request 的方式),然后就被删除。

工作流程

  1. 开发前先克隆develop分支到本地
  git clone -b develop https:``//xxxxx``.git
  1. 新建分支(每次开发新功能都对应新建单独分支 feature/xxxx)
  # 获取develop分支最新的代码
  git checkout develop
  git pull
  
  # 新建属于自己的功能分支
  git branch feature/xxx
  
  # 切换到自己的功能分支进行开发
  git checkout feature/xxx
  1. 提交分支(功能修改后可以提交了)
  # 提交代码
  git add .
  git cz
  
  # (可选)开发过程中将本地仓库开发的功能分支push到远程仓库
  git push origin -push origin feature/xxx
  # 上面git push 的 -u 参数,表示将远程仓库 origin/feature/xxx 与 本地仓库 feature/xxx 建立关联,下一次执行 push 命令,可省略后面的远程仓库名和分支名,直接输入git push即可

  1. 与develop同步(每次请求合并之前或每天早晨本地要先更新develop分支到最新,经常与develop保持同步,然后将最新的develop merge到自己的功能分支)
 # 获取develop分支最新代码
  git checkout develop
  git pull

  # 切回当前开发的功能分支
  git checkout feature/xxx

  # 合并develop分支到当前分支,即自己的功能分支除新改的功能代码以外,其余要保持和develop分支同步
  git merge develop
  1. 发出Pull Request合并请求
# 完成当前特性分支的所有开发任务,进行最后一次与develop主干同步工作并提交到远程仓库以后,就可以发出Pull Request到develop分支,然后请求管理员进行Code Review,确认可以合并到 dev 分支
  # 在合并请求之前,再次与develop来一次同步工作
  # 获取develop分支最新代码
  git checkout develop
  git pull

  # 切回当前开发的功能分支
  git checkout feature/xxx

  # 合并develop分支到当前分支,即自己的功能分支除新改的功能代码以外,其余要保持和develop分支同步
  git merge develop

  # 提交到远程仓库
  git checkout feature/xxx
  git push origin feature/xxx

  # 在 Gitlab 管理界面创建 Pull Request,等待管理员进行 Code Review
  1. 版本上线
  # 当本次需要上线的版本功能全部ok后,合并develop分支到main分支进行版本的发布
  git checkout main
  git pull
  git merge develop

  # 把main分支代码推送到远程仓库
  git push

  # 版本更新后针对main打tag
  # 在gitlab上打tag:仓库——选择要打tag的仓库——左侧点击标签菜单——新建标签——输入标签名、要打tag的分支、标签描述
  # git命令:git tag -a 标签名 -m '描述'
  1. 清理无用分支
 # 功能分支开发完成且上线后,应删除分支
 # 首先切回develop分支
 git checkout develop

 # 先删除远程功能分支
 git push origin -d feature/xxx

 # 再删除本地功能分支
 git branch -d feature/xxx
  1. 线上紧急修复
  # 用于紧急修复生产环境bug的分支,基于main分支创建,命名规范 hotfix/xxx
  # 获取main分支最新代码
  git checkout main
  git pull
 
  # 基于main新建一个热修复分支
  git branch hotfix/xxx
 
  # 切换到该热修复分支进行开发
  git checkout hotfix/xxx
 
  # 修复完毕后进行分支提交
  # 提交代码
  git add .
  git cz
  # push到远程仓库
  git push -u origin hotfix/xxx
  # 创建合并请求(在Gitlab管理界面创建PR请求,等待管理人员进行Code Review)
 
  # 管理人员基于main分支进行版本发布更新,然后打tag标签
  # 清理无用分支
  # 首先,切换回 develop 分支
  git checkout develop
 
  # 先删除远程特性分支
  git push origin -d hotfix/xxx
 
  # 再删除本地特性分支
  git branch -d hotfix/xxx

Gitlab规范提交模版

通常在GitLab中使用提交request或者加issue的过程中都会遇到每次填写相似内容的情况,为了团队规范,创建Merge Request和Issue请求时自动带出固定格式模版。

  1. 在项目中创建文件夹 .gitlab(和 .git 是在同一目录)
  2. 创建 merge_request_templates 和 issue_templates 文件夹

issue_templates文件夹中包含文件及各自的文件内容如下:

# 文件:
build.md 
chore.md 
ci.md 
docs.md 
feat.md 
fix.md
perf.md
refactor.md
revert.md
style.md
test.md
# 内容(每个文件对应自己独立的内容):
build[chore/ci/docs/feat/fix/perf/refactor/revert/style/test](修改模块/范围): 短描述

长描述

期望结果:

截图:

merge_request_templates文件夹中包含文件及各自的文件内容如下:

# 文件:
build.md 
chore.md 
ci.md 
docs.md 
feat.md 
fix.md
perf.md
refactor.md
revert.md
style.md
test.md
# 内容(每个文件对应自己独立的内容):
build[chore/ci/docs/feat/fix/perf/refactor/revert/style/test](修改模块/范围): 短描述

长描述

BREAKING CHANGE: 当前版本对上一个版本不兼容的描述

Closes 关联issue