【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.,看这个错貌似将接口变成了静态资源来访问了,第一时间觉得是端点没有注册成…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
