【Git】关于项目开发分支的使用规范

背景

在项目开发过程中,往往一个优秀的产品都会出现不断的版本迭代,我时常在项目发布后对于如何结合后续更新的业务场景在分支上的应用没有一个很好的办法,一直也比较苦恼。目前项目的迭代场景如下,一个A项目,经过需求分析,产品经理下令开发团队开发,那么经过数月后成功上线,发布V1.0.0.0. 紧接着我们就会进入第二期开发,产品经理会列出第二期的具体开发内容,随即我们就开干了……,然后在开发过程中,发布出去的V1.0.0.0反馈出很多问题,有业务的,有紧急的,各种情况的问题….

对于上面的问题,我相信很多人都遇到过,如果是你,你会怎么做呢?我先说一下目前我的做法,首先我放弃了主分支概念,当产品经理说我们第一个版本为V1.0.0.0时,我在git上就创建出了分支V1.0.0.0,我以版本为分支的形式来应对。当进入第二期时,我会根据V1.0.0.0的最新commit来创建出一个新分支V1.0.0.1作为下一个版本的开发分支。如果V1.0.0.0反馈有问题,我会立即切回到V1.0.0.1分支上进行开发,测试,然后tag一个新的标签出来为V1.0.0.0.1 作为修复版本……,然后将代码合并到V1.0.0.1上继续开发。

对于上面这种玩法前期还好,后期有一个重大缺点,因为按照版本号创建的分支,所以后期分支会非常多,难以维护,最终会把自己累死。

优点缺点
使用 tag 明确版本分支命名不清晰(既是 1.0.0.0 又包含 1.0.0.1 内容)
tag 打在某个 commit 上是合理的没有合并到主分支(main),未来不好维护
便于查看历史提交如果多人协作,容易造成混乱
能记录版本信息后续修复 bug 不方便追溯

标准版本发布流程

后来基于上面的痛点以及询问了一些前辈的意见,打算使用如下的一个流程。这是一个 基于 Git 的常见版本管理流程(适用于敏捷开发):

1.分支结构
分支用途说明是否要长期存在
master主分支,用于生产环境代码长期
dev开发主分支,集成所有功能长期
release/版本号准备发布的版本分支(不加新功能)临时
hotfix/版本号紧急修复分支(不加新功能)临时
2.版本开发 & 发布流程图
develop↓ merge → release/4.1.0.1 → 测试团队测试↓测试通过 → 打 tag v4.1.0.1↓merge 到 main(或直接部署)↓merge 回 develop(带回 bug 修复)
3.标准流程
3.1 创建release/版本号 分支

先创建出一个分支release/4.1.0.1

3.2 根据产品经理发布的版本进行开发

dev分支上开发完要求的功能内容

3.3 在release/版本号做最后调整跟测试
  • 开发完成的功能合入 release/4.1.0.1

  • 修复一些小问题(不能加新功能)

3.4 提交给测试部门测试
  • release/4.1.0.1分支提交给测试部门测试
  • 测试完成后确认没问题
3.5 合并到主分支
  • 合并到master
  • 在最新的commit上打上tag=v4.1.0.1
3.6 合并到开发分支
  • 合并到dev
3.7 删除release
  • 看一下需要,如果不经常再变动,可以先删掉。后期如果需要,可以再根据tag标记的位置根据实际情况来新建出/release/版本号
4.如果上线后发现 bug 怎么办?——打 Hotfix
4.1 创建 hotfix 分支

先基于某一个tag:v4.1.0.1上新建一个紧急分支出来hotfix/4.1.0.1-patch1

4.2 修复 bug 并测试通过
  • hotfix/4.1.0.1-patch1分支提交给测试部门测试
  • 测试完成后确认没问题
4.4 合并master
  • 合并到master
  • 在最新的commit上打上tag=v4.1.0.1-patch1
4.5 合并到开发分支
  • 合并到dev
4.5 删除分支
  • 删除hotfix/4.1.0.1-patch1分支

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87346.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

msquic的windows版本编译

首先确保安装cmake和powershell(需要6以上,本人升级到了7.5),vs(本人用的vs2022) powershell,默认是5,会编译不成功,所以附带一个升级的流程 $PSVersionTable.PSVersion …

批量文件重命名工具 OncePower ,永久免费!

软件介绍 适用于Windows OncePower是一款Windows批量重命名工具,支持基本及高级匹配重命名,无需复杂正则。特色包括匹配修改、长度截取、日期命名、前缀后缀修改及TXT文件导入。支持保留特定内容、批量移动文件和删除空文件夹。可保存设置,…

Python入门Day6.1:异常处理

一、什么是异常(Exception)? 异常是指程序运行过程中出现的错误情况。比如: 打开一个不存在的文件0作为除数列表索引越界类型转换失败 二、基本结构:try...except try:# 可能出错的代码 except 错误类型:# 出错时执…

C++中的标准模板(STL)

C中的核心标准模板包含:容器、迭代器、算法、函数对象、适配器。 1.容器 容器提供了各种数据结构,包括向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等,可以根据实际需求选择合适的容器。 容器分为三大类&…

excel 待办日历软件(需要宏)特别推荐

Excel待办日历软件是一款基于Excel表格的日程管理工具,能够帮助用户更高效地管理待办事项和日程安排。用户可以在软件中创建不同的任务列表,以便更好地进行管理和跟踪。软件还提供了日历视图,用户可以直观地查看和安排每日的任务,…

激活函数-sigmoid、tanh、relu、softmax对比

激活函数是神经网络的核心组件,用于引入非线性特性,使网络能够学习复杂模式。以下从定义、作用、分类及应用场景进行详细解析: 🔍 ​​一、定义​​ 激活函数(Activation Function)是作用于神经元输出的​…

三步走实现嵌入式硬件与软件开发

目录 ✅ 一、嵌入式硬件与软件的边界(为你后面每阶段安排任务打基础) ✅ 二、三阶段开发策略规划(以你的三步走为主线) 📍阶段1:确定能做 → 外包技术顾问协助选型 + 需求拆解 + 采购建议 适用角色 关键目标 如何管理? 工具推荐 📍阶段2:会做一些 → 小范围…

ubuntu运行cursor

一.CURSOR官网下载AppImage文件 https://www.cursor.com/en/download 二、解压 AppImage 绕过挂载机制 解决:默认使用Cursor.AppImage 会自动挂载临时目录在/tmp目录下,出现没有权限挂载的报错问题 若挂载点仍不可写,直接解压 AppImage 运…

PTA天梯赛L1 071-080题目解析

目录 1.L1-071 前世档案 2.L1-072 刮刮彩票 3.L1-073 人与神 4.L1-074 两小时学完C语言 5.L1-075 强迫症 6.L1-076 降价提醒机器人 7.L1-077 大笨钟的心情 8.L1-078 吉老师的回归 9.L1-079 天梯赛的善良 10.L1-080 乘法口诀数列 1.L1-071 前世档案 解析:…

git常用操作 --- idea编译器 --- 公司实战版

前言 虽然git的命令方式很灵活,但是还是不够人性化,不够方便。 如果对git操作不熟练特别容易犯迷,可能敲一会命令就不知道当前在干什么了,下一步要干什么。 下面,我将演示在Java开发中使用最常用最经典的idea编译器来进行git操作,非常人性化和方便。 如果没有安装git和初始…

window显示驱动开发—流输出阶段

流输出 (SO) 阶段可以在这些顶点到达光栅器之前将顶点流式传输到内存。 流输出的运行方式类似于管道中的点击。 即使数据继续向下流向光栅器,也可以打开此点击。 通过流输出发送的数据连接到缓冲区。 这些缓冲区可以在后续传递上作为管道输入进行循环。 流输出的一…

备份docker desktop中的opengauss数据库

文章目录 备份docker desktop中的opengauss数据库一、前提条件二、备份步骤三、注意事项四、自动化备份(可选)五、验证备份 备份docker desktop中的opengauss数据库 ​ 以下是在 Docker Desktop 中备份 OpenGauss 数据库(以你的环境为例&…

实时中值滤波 + 低通滤波 示例程序(STM32环境)

一、功能概述 本示例实现两个滤波器: 中值滤波器(Median Filter):对短期异常值(如尖峰噪声)有良好的抑制能力;低通滤波器(Low-Pass Filter):对数据进行平滑…

AtCoder Beginner Contest 409 题解

本文为AtCoder Beginner Contest 409 的详细题解 目录 题目A: 题目大意: 解题思路: 代码(C): 题目B: 题目大意: 解题思路: 代码(C): 题目C: 题目大意: 解题思路: 代码(C): 题目D: 题目大意: 解题思路: 代码(C): 题目E: 题目大意: 解题思路: 代码(C): 题目A…

Spring @Environment 典型用法

简单说:Spring 里没有直接叫 Environment 的注解,更准确说常用的是 Autowired 注入 Environment 对象,或者结合 Value 配合 Environment 读取配置 。 支持从以下来源读取: 1、application.properties / .yaml 2、JVM 参数&#xf…

【集合与结构体】5.2(课本题)总结代码

ds老师产物&#xff0c;纯为期末复习&#xff0c;自用。 题目1 编写程序&#xff0c;将一个整型变量右移 4 位&#xff0c;并以二进制数形式输出该整数在移位前和移位后的数值。 //观察系统填补空缺的数位情况 代码解答 #include <iostream>//编写程序&#xff0c;将一个…

16.max/min最大最小值函数

1.基本使用 max/min函数返回满足where条件的一列的最大/最小值。 select max(column_name)|min(column_name) from table_namewhere where_definition 示例&#xff1a; ①求班级总分的最高分 #求班级总分的最高分 SELECT MAX(math_scorechinese_scoreenglish_score)AS 总分…

需要做一款小程序,用来发券,后端如何进行设计能够保证足够安全?

温馨提示&#xff1a;本文由ai生成&#xff0c;请辨别阅读&#xff0c;本文仅提供一种思考的方式和设计思路 设计一个安全的后端系统&#xff0c;用于发放优惠券的小程序&#xff0c;需要考虑多个安全层面&#xff0c;包括身份验证、数据安全、API 安全、以及防止常见攻击&…

ACM设计平台-核心模块解析-赵家康

负责模块解析-赵家康 一、Login.vue 功能逻辑、数据绑定、表单验证、与后端交互 Vue 登录页面的代码设计 代码功能概览 代码实现了一个典型的登录页功能&#xff0c;核心包括&#xff1a; 表单输入&#xff08;学号、用户名、密码、验证码&#xff09; 验证码生成与校验 勾…

在 VMware (WM) 虚拟机上安装的 Ubuntu 22.04 分配了 20GB 磁盘,但仅使用 10GB 就显示 “空间已满“

可能原因及解决方案 虚拟机磁盘未实际扩容&#xff08;仅调整了虚拟大小&#xff09; 现象&#xff1a;在 VMware 里调整了磁盘大小&#xff08;如 20GB → 50GB&#xff09;&#xff0c;但 Ubuntu 内部仍只识别 10GB。 原因&#xff1a;VMware 调整的是虚拟磁盘上限&#xf…