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面板,在这里填提交注释就可以自动生成格式化的注释。
交互式页面说明
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提交时,如果填写的信息不符合上述要求,则会终止本次提交并输出错误提示信息
注:上述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 的方式),然后就被删除。
工作流程
- 开发前先克隆develop分支到本地
git clone -b develop https:``//xxxxx``.git
- 新建分支(每次开发新功能都对应新建单独分支 feature/xxxx)
# 获取develop分支最新的代码
git checkout develop
git pull
# 新建属于自己的功能分支
git branch feature/xxx
# 切换到自己的功能分支进行开发
git checkout feature/xxx
- 提交分支(功能修改后可以提交了)
# 提交代码
git add .
git cz
# (可选)开发过程中将本地仓库开发的功能分支push到远程仓库
git push origin -push origin feature/xxx
# 上面git push 的 -u 参数,表示将远程仓库 origin/feature/xxx 与 本地仓库 feature/xxx 建立关联,下一次执行 push 命令,可省略后面的远程仓库名和分支名,直接输入git push即可
- 与develop同步(每次请求合并之前或每天早晨本地要先更新develop分支到最新,经常与develop保持同步,然后将最新的develop merge到自己的功能分支)
# 获取develop分支最新代码
git checkout develop
git pull
# 切回当前开发的功能分支
git checkout feature/xxx
# 合并develop分支到当前分支,即自己的功能分支除新改的功能代码以外,其余要保持和develop分支同步
git merge develop
- 发出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
- 版本上线
# 当本次需要上线的版本功能全部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 '描述'
- 清理无用分支
# 功能分支开发完成且上线后,应删除分支
# 首先切回develop分支
git checkout develop
# 先删除远程功能分支
git push origin -d feature/xxx
# 再删除本地功能分支
git branch -d feature/xxx
- 线上紧急修复
# 用于紧急修复生产环境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请求时自动带出固定格式模版。
- 在项目中创建文件夹 .gitlab(和 .git 是在同一目录)
- 创建 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