前端 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 的配置:

  1. cms-test-pipeline-ui 构建的分支从 test2 改为 develop
  2. cms-master-pipeline-ui 构建的分支为 从 cms_pre 改为 release

修改分支下的Jenkinsfile文件:

  1. 修改 develop 分支中 Jenkinsfile 中的 def GIT_BRANCH = "develop"
  2. 修改 release 分支中 Jenkinsfile 中的 def GIT_BRANCH = "release"

Tip:由于每个分支下的 cicd 中的内容可能不同,这里使用 .gitattributes。比如有一个文件 Dockerfile,在两个分支中它是不同的,合并时不想弄乱,可以这么做:

  1. 在根目录下创建 .gitattibutes 文件,并设置内容 Dockerfile merge=ours
  2. 设置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 使用约定的更多相关文章

  1. 最全的前端Git基础命令,看完保证你会!

    常见信息 master: 默认开发分支 origin:默认远程版本库 Head: 默认开发分支 Head^:Head 的父提交 创建新仓库 git init git init [project-nam ...

  2. 前端-git思维导图笔记

    命令汇总 git config配置本地仓库 常用git config --global user.name.git config --global user.email git config --li ...

  3. vue单页(spa)前端git工程拆分实践

    背景 随着项目的成长,单页spa逐渐包含了许多业务线 商城系统 售后系统 会员系统 ... 当项目页面超过一定数量(150+)之后,会产生一系列的问题 可扩展性 项目编译的时间(启动server,修改 ...

  4. 【移动前端开发实践】从无到有(统计、请求、MVC、模块化)H5开发须知

    前言 不知不觉来百度已有半年之久,这半年是996的半年,是孤军奋战的半年,是跌跌撞撞的半年,一个字:真的是累死人啦! 我所进入的团队相当于公司内部创业团队,人员基本全部是新招的,最初开发时连数据库都没 ...

  5. 基于GitLab的前端Assets发布体系

    以SVN+RMS为核心的发布系统,对前端开发的影响上来看,存在以下问题: 覆盖式的发布,容易导致线上问题. js一旦发布,就有可能被任意其他页面使用.被引用的越多,就越重要.一旦核心js出现故障,影响 ...

  6. Git命令详解(一)-个人使用

    本文暂时不会涉及到团队如何使用Git的内容,而是从个人的角度探讨如何用好Git. 约定 绿色的5位字符表示提交的ID,文中用<commit>表示,分别指向父节点.分支用橘色显示,分别指向特 ...

  7. git 命令详细

    git是代码管理工具 github是基于git实现的代码管理平台 git --version 查看git版本 git remote -v 查看clone地址 git init 初始化git //全局设 ...

  8. docker 发布应用时添加 git revision

    概要 实施步骤 获取 git revision 前端 git revision 注入 后端 git revision 注入 概要 docker 发布应用时, 将 git revision 注入到应用中 ...

  9. git常用命令总结——覆盖日常开发全操作

    前言:Git是目前世界上最先进的分布式版本控制系统,对的,最先进! 1. 版本库,又名仓库,repository 可理解成一个目录,目录里的所有文件都可被Git管理,Git可以跟踪每个文件的修改.删除 ...

  10. Git的学习和使用

    1.1. Git 了解git的仓库概念 熟悉何为版本控制,了解分布式版本控制(git)和集中式版本控制(svn) 能够熟练使用git的基本指令完成仓库的初始化/添加/提交/日志/回退/分支等操作 gi ...

随机推荐

  1. java中有哪些并发的List?只知道一种的就太逊了

    java中有很多list,但是原生支持并发的并不多,我们在多线程的环境中如果想同时操作同一个list的时候,就涉及到了一个并发的过程,这时候我们就需要选择自带有并发属性的list,那么java中的并发 ...

  2. 【Python爬虫】使用代理ip进行网站爬取

    使用代理IP进行网站爬取可以有效地隐藏你的真实IP地址,让网站难以追踪你的访问行为.本文将介绍Python如何使用代理IP进行网站爬取的实现,包括代理IP的获取.代理IP的验证.以及如何把代理IP应用 ...

  3. MySQL系列之优化——1.优化哲学、2. 优化工具的使用、3. 优化思路分解、4. MySQL参数优化测试、5.1 参数优化、6. 参数优化结果、7. 锁的监控及处理、8. 主从优化

    文章目录 1.优化哲学 1.1 为什么优化? 1.2 优化风险 1.3 谁参与优化 1.4 优化方向 1.5 优化的范围及思路 优化效果和成本的评估: 2. 优化工具的使用 2.1 系统层面的 2.1 ...

  4. Python基础——CPU详解

    一 五大组成单元=>三大核心组件 组成计算机五大单元可以合并成三大核心组件:CPU.IO设备.主存储器 1.控制单元+算数逻辑单元=>CPU 2.主存储器,即主記憶體 3.输入单元Inpu ...

  5. 【Unity3D】动态路径特效

    1 前言 ​ 本文通过导航系统(NavMeshAgent)和线段渲染器(LineRenderer)实现了角色走迷宫和绘制路径功能,同时实现动态路径特效. ​ 导航系统的介绍详见博客:导航系统.分离路面 ...

  6. 源码搭建zabbix平台

    1.基于lnmp部署zabbix监控平台; zabbix优点: 1.支持自动发现服务器和网络设备: 2.分布式的监控体系和集中式的WEB管理: 3.支持主动监控和被动监控模式: 4.基于SNMP.IP ...

  7. GameFramework摘录 - 2.访问器模式(Version、Logger)

    访问器模式 Version.Logger等基础模块,功能相对固定但拥有几套不同的行为(如开发版本和正式版本不同),采用访问器模式,便于调整功能或复用 public static class Versi ...

  8. 快速入门:构建您的第一个 .NET Aspire 应用程序

    前言 云原生应用程序通常需要连接到各种服务,例如数据库.存储和缓存解决方案.消息传递提供商或其他 Web 服务..NET Aspire 旨在简化这些类型服务之间的连接和配置.在本快速入门中,您将了解如 ...

  9. TiDB binlog故障处理之drainer周期性罢工

    背景 前段时间用户反馈某生产环境 TiDB 集群 drainer 频繁发生故障,要么服务崩溃无法启动,要么数据跑着跑着就丢失了,很是折磨人.该集群跑的是离线分析业务,数据量20T ,v4版本,有多个 ...

  10. DP:按摩师(3.24leetcode每日打卡)

    一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接.在每次预约服务之间要有休息时间,因此她不能接受相邻的预约.给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回 ...