【git实践】分享一个适用于敏捷开发的分支管理策略
文章目录
- 1. 背景
- 2. 分支管理实践
- 2.1. 敏捷开发中分支管理面临的问题
- 2.2. 分支管理策略
- 2.3. 还需要注意的一些问题
- 3.总结
1. 背景
在实际的开发工作中,我们往往会面临多任务并行研发,多个环境管理的情况,这种情况下,一个合适的分支管理策略就显得尤为重要。特别是在使用敏捷开发流程、DevOps的团队中,由于快速响应、需求的灵活性等特征,分支管理的必要性则更加突出。
我在网上查看过一些分支管理策略的方法论,例如:git flow , github flow , one flow , gitlab flow等,但是在管理敏捷开发时,依然是差强人意。在这篇文章中,会分享一个我们公司的实践,它是由gitlab flow拓展出来的分支管理策略。
2. 分支管理实践
2.1. 敏捷开发中分支管理面临的问题
敏捷开发流程在研发中最大的特点就是需求灵活多变和小步快跑的迭代式开发,这就给的分支的管理带来了一定的挑战,试想一下如下的一些场景:
- 在研发的过程中,遇到线上问题需要立即处理并上线。
- 在同一个项目的需求A研发完成正在debug的过程中,突然插入了紧急的需求B,且要求需求B要先于需求A上线。
- 有两个需求需要并行研发,优先级都一样,谁先做完谁先上线。
- 多人研发时,每次合并的冲突特别多。
这其中的一些问题,在现有的git管理策略中并不太容易处理,为此,我们修改了分支管理策略和规范,以适应这种变化。
2.2. 分支管理策略
在说分支管理策略之前,我先说一下我们的几个环境。我们一共有三个环境,分别是:测试环境、预发环境、生产环境。
- 测试环境:用于提测后的第一轮集成测试,这一轮测试的bug会相对较多,我们会在这个环境中修复研发过程中出现的所有bug。
- 预发环境:预发环境和生产环境连接同样的存储中间件,例如MySQL和Redis,在数据上是共享的,只是在其他中间件上做了隔离。这个环境的目的是在于验证测试环境和生产环境由于环境的差异带来的问题,一般来说,预发环境修复问题后,生产基本上就没有更多的问题了。
- 生产环境:就是项目正式上线的环境。
针对这三个环境,我们了几种不同的分支类型,长期分支为:master
,develop
,短期分支为:release-版本号
,feature
, hotfix
三个,我分别解释一下作用。
- master:保存生产环境最新版本的代码,保证的是从master拉出来的代码一定是可以直接上线的。
- develop:开发和测试分支,发布测试环境的时候使用的分支,研发可以根据需要选择是否在develop上研发新版本。
- release-版本号:预发分支,一般用于预发验证和生产发布,这个分支保留两到三个版本迭代。
- feature:功能迭代分支,一般是在有并行研发的情况下拉取的分支,保证需求之间的隔离,这个分支在上线后删除。
- hotfix:问题处理分支,线上紧急问题拉取这个分支进行修改。
下面通过一个时间序列图来表示一个相对复杂的研发场景:
图中标明了序号和每一步做了什么,这里简要的描述一下关键点:
- 所有的研发分支(功能分支,hotfix分支),都是从
master
拉取的,这样保证研发分支的代码都是在线上环境的版本中拓展出来的,目的是每一个研发分支都能够独立的上线。 - 功能分支研发完成提测后,都合并到
develop
发布测试环境,这个阶段主要是解决业务流程、细节、边界问题等造成的bug。 - 预发分支的拉取,图中是按功能分支拉取的,这是因为一般一次发布规划的就是一次迭代中的这批功能,当然,如果在项目管理的过程中发现两个功能分支的完成时间非常相近,也可以合并到同一个预发分支进行验证和发布。
- 发布完成后,需要将最新的代码合并到master并打好版本tag备案,同时将master合并到
develop
和没有上线的功能分支中,避免后续代码越写越多后带来的bug。 hotfix
一般是给线上的代码打补丁,不会有特别大的改动(如果有,规划到下一次迭代中是更好的方式),所以在修改完成之后,通过预发分支进行验证就好了,非必要不用在测试环境再走一遍测试。
2.3. 还需要注意的一些问题
以上的策略实现了灵活管理多需求独立上线,降低了产生冲突的概率,能够较好的适配敏捷开发的节奏。在实际工作中,配合项目管理流程达到的效果会更佳,例如:
- 在做任务拆分和迭代规划时,将关联性强的需求分配到同一个功能分支中一同上线,这样可以很大程度上避免不同分支修改同一行代码,减少冲突的概率。
- 在研发流程中,做上线规划时,将上线完成后合并到master这一步规划到上线文档中,避免因遗忘导致后续迭代拉取的不是最新的代码。
- 如果是在一个互相信任的团队,并且团队成员的平均水平较高,可以使用上述的方式,每个人都可以进行合并发布。但如果不是这样的团队,为了减少发布的风险,需要调整流程,合并到master时需要做合并审查,并且只有管理人员可以通过master分支进行发布。
除了管理上的问题之外,有条件的话建立CICD流水线,并且通过容器的方式对发布流程进行管理,会最大化的发挥这个分支管理策略的作用。
3.总结
本篇讲的是一个适用于敏捷开发的分支管理策略,再一个互相信任且水平相对较高的团队中,可以将这个策略发挥到极致,完全匹配敏捷开发中需求灵活多变。
这个策略经过我司多年的实践,足以应对大部分的研发迭代场景,希望对大家能够有所帮助,如果对这个流程有任何疑问及建议,欢迎留言讨论!
相关文章:

【git实践】分享一个适用于敏捷开发的分支管理策略
文章目录 1. 背景2. 分支管理实践2.1. 敏捷开发中分支管理面临的问题2.2. 分支管理策略2.3. 还需要注意的一些问题 3.总结 1. 背景 在实际的开发工作中,我们往往会面临多任务并行研发,多个环境管理的情况,这种情况下,一个合适的分…...

Redis与MySQL如何保证数据一致性
Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时,才会发生数据不一致。 主要流程就是要么先操作缓存,要么先操作Redis,操作也分修改和删除。 一般修改要执行一系列业务代码,所以一般直接删除成本较低…...

基于微信小程序的教室预约系统+LW示例参考
1.项目介绍 功能模块:管理员(学生管理、教师管理、申请管理、设备管理、报修管理等)、普通用户/学生(注册登录、申请预约、退订、报修等)技术选型:SSM、JSP、uniapp等测试环境:idea2024&#x…...
Linux 安装 Git 服务器
一、安装 Git 1. 在 CentOS/RHEL 中使用以下命令: sudo yum update -y # 或者 sudo dnf update -y (在较新的系统中) sudo yum install git -y验证安装:git --version 2. 配置 Git 用户 git config --global user.name "Your Name" git co…...
总结:Yarn资源管理
一、介绍 本文梳理下Yarn的资源分配计算逻辑。 二、配置 - 资源限制 1、配置NodeManager可分配的资源池的总量 <property><name>yarn.nodemanager.resource.memory-mb</name><value>4096</value> </property> 作用对象:节点管理器(No…...

Python学习34天
import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏,0代表石头,1代见到,2代表石头 …...

深入浅出 WebSocket:构建实时数据大屏的高级实践
简介 请参考下方,学习入门操作 基于 Flask 和 Socket.IO 的 WebSocket 实时数据更新实现 在当今数字化时代,实时性是衡量互联网应用的重要指标之一。无论是股票交易、在线游戏,还是实时监控大屏,WebSocket 已成为实现高效、双向…...

三开关VUE组件
一、使用效果 <template><QqThreeSwitch v-model"value" /><!-- <SqThreeSwitch v-model"value" :options"[test1, test2, test3]"><template #left-action><div style"display: flex"><IconMoon…...

SpringCloud+SpringCloudAlibaba学习笔记
SpringCloud 服务注册中心 eureka ap 高可用 分布式容错 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency><groupId…...
牛客小白月赛105(A~E)
文章目录 A lz的吃饭问题思路code B lz的数字问题思路code C lz的蛋挞问题思路code D lz的染色问题思路code E lz的括号问题思路code 总结 牛客小白月赛105 A lz的吃饭问题 思路 签到题,比较大小即可 code void solve(){int a,b,c,d;cin >> a >> b…...
OSPF协议整理
OSPF(Open Shortest Path First)即开放式最短路径优先协议,是一种广泛应用于大型网络中的链路状态路由协议。 OSPF 的基本概念 OSPF 是基于链路状态算法的内部网关协议(IGP),用于在一个自治系统ÿ…...
Java中的多线程
文章目录 Java中的多线程一、引言二、多线程的创建和启动1、继承Thread类2、实现Runnable接口 三、线程的常用方法1、currentThread()和getName()2、sleep()和yield()3、join() 四、线程优先级五、使用示例六、总结 Java中的多线程 一、引言 在Java中,多线程编程是…...

什么是聚簇索引、非聚簇索引、回表查询
其实聚集索引也叫聚簇索引,二级索引也叫非聚簇索引,大家不要认为这是不同的两个知识点。 定义 先看一下数据库的索引介绍。 聚簇索引 1. 如果存在主键(一般都存在),主键索引就是聚簇索引。 2. 如果不存在,…...
探索 Spring 框架核心组件:构建强大 Java 应用的基石
Spring框架作为Java企业级开发的首选框架之一,其强大的功能和灵活的架构深受开发者喜爱。Spring框架的核心组件共同构建了一个高效、可扩展的应用程序开发平台。本文将深入探讨Spring框架的核心组件,揭示它们如何在Spring框架中发挥关键作用。 一、Bean…...

Android 13 Aosp 默认允许应用动态权限
图库 frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java 修改 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm new DelayingPackageManagerCache();grantPermissionsToSysCompon…...

【C++知识总结1】c++第一篇,简单了解一下命名空间是什么
一、C的由来 C语言是一种结构化和模块化的编程语言,它对于处理较小规模的程序非常适用。然而,当面临需要高度抽象和建模的复杂问题,以及规模较大的程序时,C语言就显得不那么合适了。为了应对这种挑战,并在解决软件危机…...

从0开始深度学习(32)——循环神经网络的从零开始实现
本章将从零开始,基于循环神经网络实现字符级语言模型(不是单词级) 首先我们把从0开始深度学习(30)——语言模型和数据集中的load_corpus_time_machine()函数进行引用,用于导入数据: train_iter…...

GitLab使用操作v1.0
1.前置条件 Gitlab 项目地址:http://******/req Gitlab账户信息:例如 001/******自己的分支名称:例如 001-master(注:master只有项目创建者有权限更新,我们只能更新自己分支,然后创建合并请求&…...

cuda conda yolov11 环境搭建
优雅的 yolo v11 标注工具 AutoLabel Conda环境直接识别训练 nvidia-smi 检查CUDA版本 下载nvidia cudnn对应的版本 将cuDNN压缩包内对应的文件复制到本地bin、include、lib的文件夹中 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6 miniConda快速开始-安装 执行…...

解决SpringBoot连接Websocket报:请求路径 404 No static resource websocket.
问题发现 最近在工作中用到了WebSocket进行前后端的消息通信,后端代码编写完后,测试一下是否连接成功,发现报No static resource websocket.,看这个错貌似将接口变成了静态资源来访问了,第一时间觉得是端点没有注册成…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...