当前位置: 首页 > news >正文

【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,在数据上是共享的,只是在其他中间件上做了隔离。这个环境的目的是在于验证测试环境和生产环境由于环境的差异带来的问题,一般来说,预发环境修复问题后,生产基本上就没有更多的问题了。
  • 生产环境:就是项目正式上线的环境。

针对这三个环境,我们了几种不同的分支类型,长期分支为:masterdevelop,短期分支为: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. 背景 在实际的开发工作中,我们往往会面临多任务并行研发,多个环境管理的情况,这种情况下,一个合适的分…...

rpm方式安装postgres数据库及普通用户管理数据库

一、安装postgres 数据库 下载rpm安装包 wget https://ftp.postgresql.org/pub/repos/yum/15/redhat/rhel-7.9-x86_64/postgresql15-libs-15.5-1PGDG.rhel7.x86_64.rpm wget https://ftp.postgresql.org/pub/repos/yum/15/redhat/rhel-7.9-x86_64/postgresql15-15.5-1PGDG.rh…...

使用PgBackRest备份远程PG数据库

文章目录 环境准备总体要求1. 在 PostgreSQL 服务器上配置1.1 配置 PostgreSQL1.2 配置 SSH 密钥1.4 安装PgBackRest1.4.1 使用源码编译1.4.2 直接安装 配置文件 2. 在 PgBackRest 服务器安装PgBackRest2.1 安装 PgBackRest2.2 创建必要的目录2.3 编辑配置文件2.4 配置 SSH 密钥…...

笔记mfc11

Subclass(子类化)是MFC中最常用的窗体技术之一。子类化完成两个工作:一是把窗体类对象attach到一个windows窗体实体中(即把一个窗体的hwnd赋给该类)。另外就是把该类对象的消息加入到消息路由中,使得该类可以捕获消息。 让edit能…...

Softing线上研讨会 | Ethernet-APL:推动数字时代的过程自动化

| (免费)线上研讨会时间:2024年11月19日 16:00~16:30 / 23:00~23:30 Ethernet-APL以10Mb/s的传输速率为过程工业中的现场设备带来了无缝以太网连接和本质安全电源,这不仅革新了新建工厂,也适用于改造现有工厂。 与现…...

Spring Boot 整合 ELK 全面指南:实现日志采集、分析与可视化

一、ELK简介 1.1 什么是ELK? ELK 是三个开源工具的组合: Elasticsearch:一个分布式全文搜索和分析引擎,用于存储和查询日志数据。Logstash:一个数据处理管道工具,用于收集、解析和处理日志数据。Kibana&…...

D80【 python 接口自动化学习】- python基础之HTTP

day80 requests请求加入headers 学习日期:20241126 学习目标:http定义及实战 -- requests请求加入headers 学习笔记: requests请求加入headers import requestsurlhttps://movie.douban.com/j/search_subjects params{"type":…...

在Windows环境下打包Qt C++项目为独立可执行文件的完整指南

目录 1. 配置Qt环境变量步骤: 2. 使用Release模式编译项目步骤: 3. 使用windeployqt工具收集依赖项步骤: 4. 精简复制后的文件目录方法一:使用windeployqt的选项方法二:手动删除不必要的文件方法三:使用静态…...

已存大量数据的mysql库实现主从各种报错----解决方案(看评论)

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建,使…...

Java爬虫:深入探索1688接口的奥秘

在数字化时代,数据成为了企业最宝贵的资产之一。对于电商企业来说,获取和分析数据的能力直接关系到其市场竞争力。阿里巴巴旗下的1688平台,作为中国领先的批发贸易平台,拥有海量的商家和商品信息,成为了众多企业获取数…...

Linux——基础命令(1)

目录 一、认识Linux 终端命令格式 查阅命令帮助信息 -help 辅助操作 自动补全 清屏和查看当前工作目录 二、基本命令 文件和目录常用命令 1.ls-查看文件与目录 2.cd切换目录 (1)touc创建文件或修改文件时间 (2)mkdir创…...

Java知识及热点面试题总结(一)

今天开始对Java进行总复习,主要针对热点面试题,我们再根据试题内容延申相关知识; 1.、Java中equals与“”的区别详解 讲二者区别之前,先大概讲解一下基本数据类型和引用类型的概念,当然,有一定基础的朋友…...

基于 AI 的软件工程: 超级程序员

徐昊 《AI时代的软件工程》-极客时间课程学习总结 帮助你更好地利用 LLM 提高效率,还可以站在一个更全面的立场上,讨论如何将 LLM 引入团队或是组织。 核心观点: AI 辅助业务建模:通过将模型转化为 Mermaid 格式,将我们的模型表达为大语言模型能够理解的形式。通过添加注…...

Spring Boot 2 和 Spring Boot 3 中使用 Spring Security 的区别

文章目录 Spring Boot 2 和 Spring Boot 3 中使用 Spring Security 的区别1. Jakarta EE 迁移2. Spring Security 配置方式的变化3. PasswordEncoder 加密方式的变化4. permitAll() 和 authenticated() 的变化5. 更强的默认安全设置6. Java 17 支持与语法提升7. PreAuthorize、…...

浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)

首先,在InternStudio平台上创建开发机。 创建成功后点击进入开发机打开WebIDE。进入后在WebIDE的左上角有三个logo,依次表示JupyterLab、Terminal和Code Server,我们使用Terminal就行。(JupyterLab可以直接看文件夹)…...

微信小程序+Vant-自定义选择器组件(多选

实现效果 无筛选,如有需要可参照单选组件中的方法.json文件配置"component": true,columns需要处理成含dictLabel和dictValue字段,我是这样处理的: let list arr.map(r > {return {...r,dictValue: r.xxxId,dictLabel: r.xxx…...

Vue.js 学习总结(15)—— 如何快速删除 node_modules 依赖文件

一、删除 node_modules 依赖为什么慢? 直接通过图形用户界面删除 node_modules 文件夹慢,原因主要有以下5点原因: (1)文件数量巨大:node_modules依赖可能会有上万个文件和文件夹,那么就使得操作…...

PyTorch基础05_模型的保存和加载

目录 一、模型定义组件——重构线性回归 二、模型的加载和保存 2、序列化保存对象和加载 3、保存模型参数 一、模型定义组件——重构线性回归 回顾之前的手动构建线性回归案例: 1.构建数据集;2.加载数据集(数据集转换为迭代器);3.参数初…...

Vue.js前端web练习范例:随鼠标移动的小球

技术选型:运用html、css、script、及vue组件 开发需求:编写在指定容器区域内随鼠标移动的小球,当鼠标超出容器,小球保持在边界位置不动 程序设计: 1、创建440px*440px的容器;创建30px半径的小球; 2、记录小球在面板中…...

计算机网络----基本概念

基本概念 在这一章从整体上介绍计算机网络的概况, 为后续的学习搭建起整体的框架; 介绍计算机网络中的基础术语和概念; 什么是因特网 『 因特网 』是一个世界范围内互联了数以亿计的计算设备的计算机网络; 因特网具体构成 因特网互联了数以亿计的计算设备, 这些设备被称为…...

创建可直接用 root 用户 ssh 登陆的 Docker 镜像

有时候我们在 Mac OS X 或 Windows 平台下需要开发以 Linux 为运行时的应用,IDE 或可直接使用 Docker 容器,或 SSH 远程连接。本地命令行下操作虽然可以用 docker exec 连接正在运行的容器,但 IDE 远程连接的话 SSH 总是一种较为通用的连接方…...

Linux 查看内核日志的方法

文章目录 1. dmesg 命令一. 介绍内核环形缓冲区的特点 二. 主要功能三. dmesg 使用 2. 查看kmsg文件/dev/kmsg 的用途使用 /dev/kmsg与 dmesg 的关系 3. 内核日志消息的打印行为 1. dmesg 命令 一. 介绍 dmesg(display message 或 display driver message 的缩写&…...

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后,使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件,然后按下图所示添加配置 此时再…...

DRNN 神经网络的Jacobian 信息辨识

DRNN 神经网络的 Jacobian 信息辨识 1. 基本原理 Jacobian 矩阵用于描述多输入多输出系统中输入和输出之间的偏导关系,其形式为: 对于 DRNN(Dynamic Recurrent Neural Network),其动态特性使得 y(t)\mathbf{y}(t)y(t…...

麒麟系统x86安装达梦数据库

一、安装准备前工作 操作系统:银河麒麟V10,CPU: x86_64 架构 下载地址,麒麟官网:https://www.kylinos.cn/ 数据库:dm8_20220915_x86_kylin10_64 下载地址,达梦数据库官网:https://…...

uniapp定义new plus.nativeObj.View实现APP端全局弹窗

为什么要用new plus.nativeObj.View在APP端实现弹窗?因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填,会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…...

git branch -d 删除分支

Git进行版本控制时,删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时,删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支,需要分别执行以下两个命令。 一…...

kafka生产者和消费者命令的使用

kafka-console-producer.sh 生产数据 # 发送信息 指定topic即可 kafka-console-producer.sh \ --bootstrap-server bigdata01:9092 \ --topic topicA # 主题# 进程 29124 ConsoleProducer kafka-console-consumer.sh 消费数据 # 消费数据 kafka-console-consumer.sh \ --boo…...

MyBatis框架介绍、部署及使用

一、MyBatis介绍 1.1 框架概念 **框架:**就是软件的半成品,完成了软件开发过程中的通用操作,开发者只需很少或者不用进行加工,就能 实现特定的功能。从而简化开发人员在开发过程中的步骤,提高开发效率。 1.2 常用框架…...

MySQL INSERT CRTATE DELETE DORP UPDATE WHERE 的用法

MySQL INSERT CRTATE DELETE DORP UPDATE WHERE 的用法 -- 创建数据库 CREATE DATABASE example_db;-- 使用数据库 USE example_db;-- 创建表 CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),position VARCHAR(50),salary DECIMAL(10, 2) );…...

《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全分析器, 开源口袋电源,开源健康测量,FreeCAD

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频: https://www.bilibili.com/video/BV1TYBhYKECK/ 《安富莱嵌入式周报》第346期:开源2GHz带…...

Spring ApplicationListener监听

【JavaWeb】Spring ApplicationListener-CSDN博客 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布…...

蓝桥杯练习题

目录 1.劲舞团 2.数字诗意 3.封闭图形个数 4.回文数组 欢迎 1.劲舞团 0劲舞团 - 蓝桥云课 #include <iostream> using namespace std; int main() {int num1,M0;long long c[1000000];int cnt0;string a,b ;while(cin>>a>>b>>c[cnt])//系统自动输入…...

【JAVA】Java高级:Java中的常用设计模式——设计模式的基本思想与应用场景

在软件开发中&#xff0c;设计模式是一种被反复使用的解决特定问题的最佳实践。它们提供了一种标准化的方式来解决常见的设计问题&#xff0c;使得代码更具可读性、可维护性和可扩展性。特别是在Java开发中&#xff0c;设计模式的使用可以极大地提高代码的质量和开发效率。 设…...

QT 跨平台实现 SSDP通信 支持多网卡

一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…...

疑难Tips:NextCloud域名访问登录时卡住,显示违反内容安全策略

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 1使用域名访问Nextcloud用户登录时卡住,显示违反内容安全策略 我使用官方Docker镜像来部署NextCloud 28.0.5,并通过Openresty反向代理Nextcloud,但是在安装后无法稳定工作,每次登录后,页面会卡死在登录界面,无法…...

区块链:非对称加密

在区块链技术中&#xff0c;非对称加密是一项核心技术&#xff0c;用于保障数据的安全性和用户的隐私。它通过公钥和私钥的配合&#xff0c;实现了信息加密、解密、身份验证和数字签名等功能。 1. 非对称加密的基本原理 非对称加密使用两个密钥&#xff1a; 公钥&#xff1a…...

量子安全与经典密码学:一些现实方面的讨论

量子安全与经典密码学 背景&#xff1a;量子安全与经典密码学量子计算对传统密码学的威胁 安全性分析经典密码学的数学复杂性假设**量子密码学的物理不可克隆性假设** **性能与实现难度**后量子算法在经典计算机上的运行效率**量子通信设备的技术要求与成本** **可扩展性与适用…...

WordCloud参数的用法:

-------------词云图集合------------- 用WordcloudPyQt5写个词云图生成器1.0 WordCloud去掉停用词&#xff08;fit_wordsgenerate&#xff09;的2种用法 通过词频来绘制词云图&#xff08;jiebaWordCloud&#xff09; Python教程95&#xff1a;去掉停用词词频统计jieba.toke…...

数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别

数据库&#xff08;总结自小林coding&#xff09;|索引失效的场景、慢查询、原因及如何优化&#xff1f;undo log、redo log、binlog 作用、MySQL和Redis的区别 说一下索引失效的场景&#xff1f;什么是慢查询&#xff1f;原因是什么&#xff1f;可以怎么优化&#xff1f;undo …...

(计算机组成原理)期末复习

第一章 计算机的基本组成&#xff1a;硬件软件&#xff08;程序&#xff09;计算机系统 软件有系统软件&#xff08;系统管理工具&#xff09;&#xff0c;应用软件 计算机硬件&#xff1a;包括主机和外设&#xff0c;主机包括CPU和内存&#xff0c;***CPU由运算器和控制器所组…...

Linux下一次性关闭多个同名进程

要一次性关闭多个同名的 Python 进程&#xff0c;例如&#xff1a; 你可以使用以下几种方法。在执行这些操作之前&#xff0c;请务必确认这些进程确实是你希望终止的&#xff0c;以避免意外关闭其他重要的进程。 方法一&#xff1a;使用 pkill 命令 pkill 是一个用于根据名称…...

Android显示系统(01)- 架构分析

一、前言&#xff1a; Android是基于Linux的&#xff0c;而显示设备的驱动也都是和Linux普通设备一样去管理&#xff0c;也就是说归根结底还是要按照Linux的方式组织数据送给LCD&#xff0c;因此&#xff0c;我们理解Android设计的这一套复杂的显示系统时候&#xff0c;一定要…...

Bean的生命周期详解保姆级教程,结合spring boot和spring.xml两种方式讲解,5/7/10大小阶段详细分析

文章目录 Spring Bean的生命周期一、为什么知道 Bean 的生命周期&#xff1f;二、生命周期大致了解三、详细分析生命周期3.1 ① 初步划分为 5 步&#xff1a;3.1.1 spring 框架中怎么理解3.1.2 spring boot 项目中怎么理解 3.2 ② 细分 5 步为 7 步&#xff1a;3.2.1 spring 框…...

2024年11月26日Github流行趋势

项目名称&#xff1a;v2rayN 项目维护者&#xff1a;2dust yfdyh000 CGQAQ ShiinaRinne Lemonawa 项目介绍&#xff1a;一个支持Xray核心及其他功能的Windows和Linux图形用户界面客户端。 项目star数&#xff1a;70,383 项目fork数&#xff1a;11,602 项目名称&#xff1a;fre…...

分页/列表分页

分页和单列表差不多,只是多加了点数据 一 : 实体类 1. 原生实体类 和 2.vo实体类 vo实体类包含原生实体类的所有字段 再新字段 原生(数据库里的字段) vo(多条件查询字段 ,分页字段) 分页字段 : private Integer pageNum1 //起始页 private Integer pageSize 4 //显示页数…...

微信小程序学习指南从入门到精通

&#x1f5fd;微信小程序学习指南从入门到精通&#x1f5fd; &#x1f51d;微信小程序学习指南从入门到精通&#x1f51d;✍前言✍&#x1f4bb;微信小程序学习指南前言&#x1f4bb;一、&#x1f680;文章列表&#x1f680;二、&#x1f52f;教程文章的好处&#x1f52f;1. ✅…...

STM32外设应用

STM32系列单片机是由意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M内核的32位微控制器。STM32以其高性能、低功耗、丰富的外设接口以及灵活的应用场景,广泛应用于嵌入式系统中。STM32的外设功能非常强大,几乎涵盖了大多数常见嵌入式开发所需的硬件接口。本篇文…...

Vue进阶面试题目(一)

Vue 自定义事件中&#xff0c;父组件如何接收子组件传递的多个参数? 在 Vue 中&#xff0c;子组件可以通过 $emit 方法触发自定义事件&#xff0c;并传递参数。父组件可以通过监听这个事件来接收参数。如果子组件需要传递多个参数&#xff0c;可以将这些参数作为数组或对象传…...

人工智能——大语言模型

5. 大语言模型 5.1. 语言模型历史 20世纪90年代以前的语言模型都是基于语法分析这种方法&#xff0c;效果一直不佳。到了20世纪90年代&#xff0c;采用统计学方法分析语言&#xff0c;取得了重大进展。但是在庞大而复杂的语言信息上&#xff0c;基于传统统计的因为计算量巨大…...