【git分支管理策略】如何高效的管理好代码版本
目录
1.分支管理策略
2.我用的分支管理策略
3.一些常见问题
1.分支管理策略
分支管理策略就是一些经过实践后总结出来的可靠的分支管理的办法,让分支之间能科学合理、高效的进行协作,帮助我们在整个开发流程中合理的管理好代码版本。
目前有两套Git分支管理策略GitHub Flow和GitFlow,它们各自定义了一套规范,帮助开发者更好地组织和管理源代码的版本控制流程。
GitHub Flow
简介:
GitHub Flow 是由GitHub团队推广的一种简单、灵活且快速的工作流程,特别适合小型团队和持续交付环境。
核心概念:
-
所有开发都是基于main分支(原称master,现在推荐使用main)。
-
新的功能开发通过创建短期的特性分支(feature branches)。
-
特性分支完成后,通过Pull Request (PR) 提交到main分支。
-
PR期间进行讨论、审查和自动化测试,只有当所有工作满足要求时,才将其合并至main。
优点:
GitHub Flow的优势是快速迭代,频繁部署,强调每个特性分支都应具备随时可部署的状态。
GitFlow
简介:
GitFlow 是一种更为严谨和复杂的分支模型,适用于大型项目和需要严格版本控制的企业级开发环境。
核心概念:
-
分支分为两大类:持久分支和临时分支。
-
持久分支包括:main(稳定版)、develop(开发版)。
-
临时分支包括:feature(特性分支)、release(发布分支)、hotfix(热修复分支)。
-
-
develop分支作为日常开发集成的分支,每次新增功能或修复都在独立的feature分支上完成,完成后合并回develop。
-
当产品即将发布时,创建一个release分支,进行测试和最后的调整,确认无误后合并到main和develop,并打上版本标签。
-
如果生产环境中发现了紧急问题,那么在main基础上创建hotfix分支进行修复,修复完毕后同样合并回main和develop。

优势:
结构清晰,易于跟踪每个阶段的代码状态,有利于多人协同和大型项目管理,尤其对于那些有明确版本周期和稳定版需求的项目。 总结来说,GitHub Flow 更注重敏捷开发和快速迭代,简化了分支结构;而 GitFlow 则提供了详细的分支管理方案,更适合需要精细化版本管理和长周期开发的场景。目前市面上各团队常用的管理策略基本上都是基于GitHub Flow策略的。
2.我用的分支管理策略
目前作者所在的团队采用的分支管理策略就是基于GitHub Flow策略的。
我们有以下几个分支:
-
master,稳定主分支
-
pre-release,稳定测试分支
-
develop,开发分支
-
feature,单人新特性分支
-
release,发布分支
-
patch,维护分支
当我们开发新功能的时候会先分一下任务,然后各自从develop分支上拉一个属于自己的feature分支,这个feature一般会命名为:下个版本的版本号-feature-自己名字的缩写
任务有轻重缓急和难易之分,一个大版本的所有新需求很难在统一的一个时间点上完成,所以一般都是分批次提测的,最后合并在一起发版。提测的时候各自将自己要提测的内容从自己的feature上合并到develop分支上,再从develop分支合并到pre-release上。将pre-release部署到测试环境中用于测试。之所以这样做是在实践中发现很多时候develop并不是稳定的,大家都在往上面合并代码,直接将develop用于部署测试往往无法保证测试环境的稳定,会造成阻塞。所以有一个pre-release用来保证测试环境的稳定。测试期间的bug修复也是先修自己的feature然后合并到develop然后合并到pre-release。
要注意上面的合并一般指的都是cherry pick,一条一条的合并,分支级别的merge是很容易将pre-release和develop合乱的。
所有新特性都测试完成后,将develop合并到release上,然后基于release打tag发版。
发版后有可能还会发现一些bug,一般会基于发版的tag拉一个patch分支来进行快速修复。这时候修复的bug会先在patch上修复,修复完毕后合并到develop分支上。最后这个patch分支在维护一段时间后会被丢弃。
3.一些常见问题
1.如何打tag?
在IDEA种可以通过图形化的界面来打tag:

也可以通过命令来打tag:
git tag -a <tag-name> -m "<tag-message>"
打完tag之后push到远端仓库即可。
2.如何切到某个tag
打完tag之后有些时候我们要用到打tag的代码版本,可以通过命令跳过去:
git checkout -b <new-branch-name> <tag-name>
3.如何基于tag拉分支?
打完tag代码就算是封板了,但是发版后仍然会有一些小问题会持续暴露出来,需要我们持续修复,于是我们需要基于tag拉出一个hotfix分支来,在这个分支上进行发版后的bug修复,可以通过命令来从某个tag拉出一个分支:
git checkout -b <new-branch-name> <tag-name>
3.如何合并?
在hotfix上修复的bug在当前的开发分支上当然也是存在的,所以我们要将hotfix上的bug修复持续的合并到开发分支上,这时候尽量不要用分支级别的合并命令merge来操作,尽量将bugfix一条一条的合并到开发分支上。
在IDEA上可以直接通过图形化界面将某个分支上的修改单条的合并到当前分支。操作很简单,首先保证自己当前在接收合并的分支上,然后在git log中找到要合并过来的提交,cherry pick过来即可:

4.如何比对分支之间的区别?
从hotfix合并到develop分支,这种两个分支之间一条一条的合并难免会合并漏,最好的方式当然是要比对出两个分支之间的差异,在IDEA中很好比对差异:

相关文章:
【git分支管理策略】如何高效的管理好代码版本
目录 1.分支管理策略 2.我用的分支管理策略 3.一些常见问题 1.分支管理策略 分支管理策略就是一些经过实践后总结出来的可靠的分支管理的办法,让分支之间能科学合理、高效的进行协作,帮助我们在整个开发流程中合理的管理好代码版本。 目前有两套Git…...
css的transition详解
CSS的transition属性是一个简写属性,用于设置四个过渡效果属性,以在元素的状态改变时创建平滑的动画效果。这四个属性分别是: transition-property: 定义应用过渡效果的CSS属性名称。当指定的CSS属性改变时,过渡效果将…...
agent利用知识来做规划:《KnowAgent: Knowledge-Augmented Planning for LLM-Based Agents》笔记
文章目录 简介KnowAgent思路准备知识Action Knowledge的定义Planning Path Generation with Action KnowledgePlanning Path Refinement via Knowledgeable Self-LearningKnowAgent的实验结果 总结参考资料 简介 《KnowAgent: Knowledge-Augmented Planning for LLM-Based Age…...
01 React新建开发环境
https://create-react-app.dev/docs/getting-started npx create-react-app my-appJSX使用表达式嵌入 function App() {const count 100;function getSelfName() {return "SelfName"}return (<div>Hello World!<div>{This is Javascript message~!}&l…...
nginx--解决响应头带Set-Cookie导致的验证失败
解决响应头带Set-Cookie导致的验证失败 前言给nginx.conf 设置Secure配置完成后会发现cookie就不会发生变化了 前言 在用nginx做代理的时候,会发现nginx在访问不同ip请求的时候会带setCookie 导致后端就是放开cookie验证,在访问玩这个链接他更新了cooki…...
InstructGPT的流程介绍
1. Step1:SFT,Supervised Fine-Tuning,有监督微调。顾名思义,它是在有监督(有标注)数据上微调训练得到的。这里的监督数据其实就是输入Prompt,输出相应的回复,只不过这里的回复是人工…...
docker容器下部署hbase并在springboot中通过jdbc连接
我在windows的docker中部署了一个hbase服务,然后用springboot连接到此服务并访问数据。 详情可参考项目中的README.md。项目中提供了用于构建镜像的dockerfile,以及测试代码。 项目连接: https://gitee.com/forgot940629/hbase_phoenix_sprin…...
Qt——智能指针实战
目录 前言正文一、理论介绍1、QPointer2、QScopedPoint3、QSharedPoint4、QWeakPoint 二、实战演练1、QPoint2、QScopedPoint3、QSharedPointa、示例一b、示例二 4、QWeakPoint END、总结的知识与问题 参考 前言 智能指针的使用,对很多程序员来说,都算是…...
Unity Mobile Notifications推送问题
1.在部分机型点击通知弹窗进不去游戏 把这里改成自己的Activity 2.推送的时候没有横幅跟icon红点 主要是第一句话 注册的时候选项可以选择 defaultNotificationChannel new AndroidNotificationChannel(“default_channel”, “Default Channel”, “For Generic notifica…...
C++_回文串
目录 回文子串 最长回文子串 分割回文串 IV 分割回文串 II 最长回文子序列 让字符串成为回文串的最少插入次数 回文子串 647. 回文子串 思路,i j表示改范围内是否为回文串, ②倒着遍历是为了取出dp[i 1][j - 1] ③i j 只有一对,不会重复…...
【阅读论文】When Large Language Models Meet Vector Databases: A Survey
摘要 本调查探讨了大型语言模型(LLM)和向量数据库(VecDB)之间的协同潜力,这是一个新兴但迅速发展的研究领域。随着LLM的广泛应用,出现了许多挑战,包括产生虚构内容、知识过时、商业应用成本高昂…...
兼职副业大揭秘:六个潜力满满的赚钱途径
亲爱的朋友,你对兼职副业充满好奇与期待,这非常好!在此,我将为你分享一些能够助你赚取额外收入的兼职副业建议。以下是六个颇具潜力的兼职副业方向,希望能为你的探索之路提供些许启发。 1,网络调查与市场洞…...
C++ Qt开发:QUdpSocket实现组播通信
Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…...
excel 表中有图片并在筛选特定行时,只显示该行的图片
建议:选中excel 表中某张图片,CtrlA,选中所有图片。再右键,在菜单中选设置对象格式 在属性里按下图设置, 生效之后,筛选某个产品的时候,就不会显示其他的不符合筛选条件的产品的图片了。...
【QA】MySQL多表查询详解
文章目录 前言关系型数据库中数据表之间的关系数据准备数据内容表间关系 基础查询 | 全部查询多表查询分类1 | 连接查询内连接外连接 | 左外连接外连接 | 右外连接自连接 | 自连接自连接 | 联合查询 分类2 | 子查询返回结果分类 | 标量子查询返回结果分类 | 列子查询返回结果分…...
【Entity Framework】 EF三种开发模式
【Entity Framework】 EF三种开发模式 文章目录 【Entity Framework】 EF三种开发模式一、概述二、DataBase First2.1 DataBase First简介2.2 DataBase First应用步骤2.3 DataBase First总结 三、Model First3.1 Model First简介3.2 Model First实现步骤 四、Code First4.1 Cod…...
数据分析---SQL(5)
目录 子查询单行子查询多行子查询视图(View)创建视图使用视图更新视图视图的优缺点存储过程存储过程的创建存储过程的参数存储过程的优缺点可能导致性能问题避免存储过程引入性能问题子查询 子查询是指在一个查询语句中嵌套另一个查询语句,内部的查询语句称为子查询,外部的…...
《剑指 Offer》专项突破版 - 面试题 93 : 最长斐波那契数列(C++ 实现)
题目链接:最长斐波那契数列 题目: 输入一个没有重复数字的单调递增的数组,数组中至少有 3 个数字,请问数组中最长的斐波那契数列的长度是多少?例如,如果输入的数组是 [1, 2, 3, 4, 5, 6, 7, 8]࿰…...
代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离
583. 两个字符串的删除操作 刷题https://leetcode.cn/problems/delete-operation-for-two-strings/description/文章讲解https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html视频讲解https://…...
StringRedisTemplate Autowired注入为空解决
如下注入方式报空指针异常: java.lang.NullPointerException: null Autowiredprivate StringRedisTemplate redisTemplate; 解决办法:查看该类上有没有加注解,如Component等,没加的话加上。 还有一种是在工具类中使用,…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
