前端 Git 使用约定
前端 Git 使用约定
背景
开发前端项目,有以下困惑:
- 使用哪个分支开发,哪个分支发布
- 修复线上bug的流程是什么,如何避免修复完了下次却又出现了
- cms分支有十多个,是否都有用
- 如何快速找到之前某次功能开发,或某次bug修复
为了减轻上述困扰,引入 gitflow 规范,并根据公司情况做适当调整。
gitflow
GitFlow 是一种基于 Git 的工作流程设计,它是由 Vincent Driessen 在2010年提出的。是一种分支管理模型。请看下图:

从右往左一共5个分支。
首先是 master 主分支,也就是线上代码。不应该直接修改,只需要合并其他分支。
其次是 develop 开发分支,从master拉取,也不应该直接修改。
现在有两个版本的需求需要开发,一个是下一个版本 1.0 的(Major feature for next release)的需求,另一个是下下个版本2.0(Feautre for future release)的需求,时间更长。所以直接从 develop 分支拉取两个 feature 功能分支。
其他人也在持续的推进 develop 分支的前进
现在 1.0 的需求开发完成,于是将 feature 分支合并到 develop 中,然后从 develop 中拉取一个 release 分支,用于发布前的测试,这个 release 分支就不在开发新功能,只做bug修复(Only bugfixes),同时修复的bug也需要同步到 develop 分支,最后测试通过,则将 release 分支合并到 master 分支,同时将 release 分支合并到 develop。
线上有了问题,需要紧急处理,于是从 master 拉取 hotfixes 分支,修复完成后将 hotfixes 合并到 master 分支和 develop 分支,避免后续 develop 还有这个问题。
其中 master 分支和 develop 分支是一直存在的,其他分支都是临时的。master 分支用于存放稳定的生产版本代码,而 develop 分支则用于集成各个功能分支最新的开发成果。
分支和环境对应关系:
| feature | develop | release | hotfix | master |
|---|---|---|---|---|
| 开发环境 | 测试环境 | 预发布环境 | 线上 | 线上 |
分支流程:
feature -> develop -> release -> master
小建议
- 保持 develop 分支和 feature 分支同步:如果 develop 变动比较频繁,建议每天上班就将 develop 分支合并到 feature,这样避免两个分支差别太大,造成 feature 不能合并到 develop分支,或者需要很长时间解决冲突。
- feature 分支也要时刻提交代码。万一机器坏了...
提交信息规范
Conventional Commits 是一种提交消息的规范格式
<类型>[可选的作用域]: <描述>
[可选的正文]
[可选的脚注]
例如:
/*
<类型>[可选的作用域]: <描述>
*/
feat(login): add login form validation
/*
<类型>[可选的作用域]: <描述>
[可选的正文]
*/
fix(注册): 修复用户注册时的验证逻辑错误
之前的逻辑判断漏掉了对用户名长度的限制,导致用户可以注册过长的用户名,现在已经修复了该问题,并增加了相应的验证逻辑。
修复了一个潜在的安全漏洞。
/*
<类型>[可选的作用域]: <描述>
[可选的正文]
[可选的脚注]
*/
feat(auth): 增加JWT认证
- 实现 JWT 生成和验证
- 更新认证中间件
关闭问题 #12345
类型有如下:
feat:表示引入新的功能(feature)的提交,即添加新的功能特性。fix:表示修复 bug 的提交,用于修正代码中的错误或问题。docs:表示文档变更的提交,指示与文档相关的修改,比如更新文档或注释。style:表示代码样式(style)的修改,通常是不影响代码含义的调整,比如空格、格式化等。refactor:表示重构代码的提交,即对现有代码结构进行非修复性的修改。test:表示增加或修改测试的提交,用来新增或调整单元测试、集成测试等测试代码。chore:表示其他零碎的提交,通常包括构建工具、辅助工具等的修改,比如更新构建脚本、任务管理等。perf: 性能提升
示例如下:
feat: 添加用户管理模块
fix: 修复用户登录时的密码验证问题
docs: 更新安装指南
style: 格式化用户信息显示界面
refactor: 重构用户信息存储逻辑
test: 添加用户注册模块的单元测试
CMS改造
以CMS为例,常用的分支需要三种:开发分支、预发布分支、master分支。将其重命名并与jenkins同步。具体操作如下:
CMS目前有 4 个分支:
PS ChinaEdu-H5> git branch -r
origin/HEAD -> origin/cms_master
origin/test2
origin/cms_master
origin/cms_pre
origin/cms_test
将分支重命名,分支和环境的对应关系如下:
// 将 test2 分支重命名 develop,对应测试环境
test2 -> develop 对应测试环境
cms_pre -> release 对应预发布环境
cms_master -> master 对应线上环境
例如将 test2 重命名为 develop:
$ /cms (test2)
$ git pull
Already up to date.
$ /cms (test2)
$ git branch -m test2 develop
$ /cms (develop)
$ git push -u origin :test2 develop
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for develop, visit:
remote: https://gitlab.xx.com/cms-ui/...
remote:
To https://gitlab.xx.com/cms-ui.git
- [deleted] test2
* [new branch] develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
另外两个分支也类似。
修改 jenkins 的配置:
- cms-test-pipeline-ui 构建的分支从 test2 改为 develop
- cms-master-pipeline-ui 构建的分支为 从 cms_pre 改为 release
修改分支下的Jenkinsfile文件:
- 修改 develop 分支中 Jenkinsfile 中的
def GIT_BRANCH = "develop" - 修改 release 分支中 Jenkinsfile 中的
def GIT_BRANCH = "release"
Tip:由于每个分支下的 cicd 中的内容可能不同,这里使用 .gitattributes。比如有一个文件 Dockerfile,在两个分支中它是不同的,合并时不想弄乱,可以这么做:
- 在根目录下创建 .gitattibutes 文件,并设置内容
Dockerfile merge=ours - 设置git merge的配置项
git config --global merge.ours.driver true
当你合并其他分支时,如果生效,在命令行中会显示:
$ git checkout branchA
$ git merge branchB
Auto-merging Dockerfile
Merge made by recursive.
Tip:需要注意的是,gitattribute 方法生效是有条件的,跟文件的修改时间顺序有关系。比如在 pre 分支中合并 develop,如果不想 pre 分支中 Dockerfile 被覆盖,需要 pre 中的 Dockerfile 更新,也就是要比 develop 中的 Dockerfile 修改时间更加接近现在。
Q/A
问:使用哪个分支开发,哪个分支发布
答:从 develop 分支拉取 feature 分支进行开发,用 release 分支预发布,用 master 发布。
问:修复线上bug的流程是什么,如何避免修复完了下次却又出现了
答:直接从master分支拉取 hotfixes 分支开发,然后合并到 develop 分支到测试环境测试,如果紧急则直接合并到 release,在预发布测试通过后合并到 master,最后不要忘记合并到 develop
问:cms分支有十多个,是否都有用
答:没有用的分支尽快删除
问:如何快速找到之前某次功能开发,或某次bug修复
答:使用Conventional Commits提交规范
问:dist 需要提交吗?
答:不需要,jenkins 会自己构建。
前端 Git 使用约定的更多相关文章
- 最全的前端Git基础命令,看完保证你会!
常见信息 master: 默认开发分支 origin:默认远程版本库 Head: 默认开发分支 Head^:Head 的父提交 创建新仓库 git init git init [project-nam ...
- 前端-git思维导图笔记
命令汇总 git config配置本地仓库 常用git config --global user.name.git config --global user.email git config --li ...
- vue单页(spa)前端git工程拆分实践
背景 随着项目的成长,单页spa逐渐包含了许多业务线 商城系统 售后系统 会员系统 ... 当项目页面超过一定数量(150+)之后,会产生一系列的问题 可扩展性 项目编译的时间(启动server,修改 ...
- 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知
前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...
- 基于GitLab的前端Assets发布体系
以SVN+RMS为核心的发布系统,对前端开发的影响上来看,存在以下问题: 覆盖式的发布,容易导致线上问题. js一旦发布,就有可能被任意其他页面使用.被引用的越多,就越重要.一旦核心js出现故障,影响 ...
- Git命令详解(一)-个人使用
本文暂时不会涉及到团队如何使用Git的内容,而是从个人的角度探讨如何用好Git. 约定 绿色的5位字符表示提交的ID,文中用<commit>表示,分别指向父节点.分支用橘色显示,分别指向特 ...
- git 命令详细
git是代码管理工具 github是基于git实现的代码管理平台 git --version 查看git版本 git remote -v 查看clone地址 git init 初始化git //全局设 ...
- docker 发布应用时添加 git revision
概要 实施步骤 获取 git revision 前端 git revision 注入 后端 git revision 注入 概要 docker 发布应用时, 将 git revision 注入到应用中 ...
- git常用命令总结——覆盖日常开发全操作
前言:Git是目前世界上最先进的分布式版本控制系统,对的,最先进! 1. 版本库,又名仓库,repository 可理解成一个目录,目录里的所有文件都可被Git管理,Git可以跟踪每个文件的修改.删除 ...
- Git的学习和使用
1.1. Git 了解git的仓库概念 熟悉何为版本控制,了解分布式版本控制(git)和集中式版本控制(svn) 能够熟练使用git的基本指令完成仓库的初始化/添加/提交/日志/回退/分支等操作 gi ...
随机推荐
- fasthttp + `page partial gziped cache`: 页面输出服务性能提升20%
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 接上一篇:http 中使用 gzip 输出内容时,如何预先 ...
- SQL-报错注入
updatexml报错注入 updatexml (XML_document, XPath_string, new_value): 第一个参数:XML_document是String格式,为XML文档对 ...
- 【算法】游戏中的学习,使用c#面向对象特性控制游戏角色移动
最近,小悦的生活像是一首繁忙的交响曲,每天忙得团团转,虽然她的日程安排得满满当当,但她并未感到充实.相反,她很少有时间陪伴家人,这让她感到有些遗憾.在周五的午后,小悦的哥哥突然打来电话,他的声音里充满 ...
- 【matplotlib 实战】--气泡图
气泡图是一种多变量的统计图表,可以看作是散点图的变形.与散点图不同的是,每一个气泡都表示三个维度的数据,除了像散点图一样有X,Y轴,气泡的大小可以表示另一个维度的数据.例如,x轴表示产品销量,y轴表示 ...
- 16. 从零开始编写一个类nginx工具, 反向代理upstream源码实现
wmproxy wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感 ...
- P1522 [USACO2.4] 牛的旅行 Cow Tours
Problem 题目简述 给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值. 思路 本题主要做法:\(Floyd\). 首先,Floyd求出任意两个点之间的最短路 ...
- DP优化方法杂记
一些奇妙trick 观察决策集合 此类问题与单调队列优化dp有部分相似,都是利用决策集合的特殊性质对dp进行优化. CF229D Towers 题意:给出一个序列,每次可以花费一体力合并相邻两个数,问 ...
- WebSocket魔法师:打造实时应用的无限可能
1.背景 在开发一些前端页面的时候,总是能接收到这样的需求:如何保持页面并实现自动更新数据呢?以往的常规做法,是前端使用定时轮询后端接口,获取响应后重新渲染前端页面,这种做法虽然能达到类似的效果,但是 ...
- STM32 定时器时钟配置技巧
众所周知 STM32 的时钟配置比较复杂,而定时器的时钟配置更是 '奇葩'. 如下图(截图自STM32F4编程手册)APB的预分频器分频系数如果不为1,则定时器的时钟就倍频了反而. 配置技巧 下面以S ...
- window.onload 触发时机问题
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...