【CI/CD】Git Flow 分支模型

Git Flow 分支模型

1.前言

Git Flow 模型(本文所阐述的分支模型)构思于 2010 年,也就是 Git 诞生后不久,距今已有 10 多年。在这 10 多年中,Git Flow 在许多软件团队中大受欢迎。

在这 10 多年里,Git 本身已经风靡全球,而使用 Git 开发的最流行的软件类型也更多地转向了网络应用。网络应用通常是持续交付的,不会回滚,也不需要支持多个版本的软件同时运行。这与原作者在 10 年前写这篇博文时所考虑的软件类型不同。

如果你的团队正在进行软件的持续交付,建议采用更简单的工作流程(比如 GitHub Flow),而不是试图把 Git Flow 强塞进你的团队。不过,如果您正在构建明确版本化的软件,或者您需要支持软件的多个版本,那么 Git Flow 可能仍然适合您的团队。

最后,请记住,一劳永逸式的通用解决方案是不存在的。考虑一下你自己的项目背景,再做决定。

在这里插入图片描述

2.Main branches 主要分支

在核心部分,开发模型受到了现有模型的极大启发。中心仓库拥有两个无限生命周期的主分支:

  • master
  • develop

在这里插入图片描述
每个 Git 用户对位于 origin 的 master 分支都不会陌生。与 master 分支平行的另一个分支叫 develop 分支。

我们把 origin/master 视为主分支,在这里,HEAD 的源代码总是反映生产就绪的状态。

我们认为 origin/develop 是主分支,HEAD 的源代码总是反映下一个版本最新交付的开发变更状态。有人称其为 “集成分支”。每晚的自动构建都是从这里开始的。

develop 分支中的源代码达到稳定点并准备发布时,所有变更都应以某种方式合并回 master 分支,然后标记上发布编号。具体做法将在后面讨论。

因此,每次将变更合并回 master 版本时,这就是一个新的生产版本。我们倾向于严格遵守这一点,因此理论上我们可以使用 Git 钩子脚本,在每次 master 版本有提交时自动构建软件并将其发布到生产服务器上。

3.Supporting branches 辅助分支

除了主分支 master 和开发分支 develop,我们的开发模式还使用各种辅助分支来帮助团队成员之间的 并行开发简化功能跟踪为生产发布做准备,以及 协助快速修复实时生产问题。与主分支不同,这些分支的生命周期总是有限的,因为它们最终会被移除。

我们可能使用的不同类型的分支包括

  • Feature branches(特性分支)
  • Release branches(发布分支)
  • Hotfix branches(热修复分支)

每种分支都有其特定的目的,并受严格的规则约束,哪些分支可以作为其原始分支,哪些分支必须作为其合并目标。我们稍后将详细介绍它们。

从技术角度看,这些分支并不 “特殊”。分支类型是根据我们的使用方式来分类的。当然,它们都是普通的 Git 分支。

3.1 Feature branches 特性分支

来自于 develop,必须合并回 develop

在这里插入图片描述
分支命名约定:只要不用 masterdeveloprelease-*hotfix-* ,其他都可以。

feature 分支(有时也称作主题分支 Topic branches)用于 为即将发布或未来发布的版本开发新特性。在开始开发某个功能时,可能还不知道该功能将被集成到哪个目标版本中。feature 分支的本质是,只要该特性还在开发阶段,它就一直存在,但最终会被合并回 develop(将新特性添加到即将发布的版本中)。

特性分支通常只存在于开发者版本库中,而不存在于原始版本库(origin)中

(1)创建 feature 分支

开始开发新功能时,从 develop 分支创建分支。

$ git checkout -b myfeature develop
Switched to a new branch "myfeature"

(2)将已完成的功能并入 develop 分支

已完成的功能可以合并到 develop 分支,以便在即将发布的版本中加入这些功能:

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop

使用 - - no - ff 标志后,即使合并可以通过快进执行,也会始终创建一个新的提交对象。这样可以避免丢失 feature 分支历史存在的信息,并将共同添加该特性的所有提交组合在一起。

在这里插入图片描述
在后一种情况下,我们无法从 Git 历史记录中看到哪些提交对象一起实现了某个特性,而必须手动阅读所有日志信息。在后一种情况下,还原整个特性(即一组提交)确实是个令人头疼的问题,而如果使用 - - no - ff 标志,就很容易做到。

是的,这会多创建几个(空)提交对象,但收益远大于代价。

3.2 Release branches 发布分支

来自于 develop,必须合并回 developmaster

分支命名约定:release-*

release 分支支持新生产版本的准备工作。release 分支允许在最后一刻进行校验。此外,它们还可以进行小的错误修复,并为发布版本准备元数据(版本号、构建日期等)。在 release 分支上完成所有这些工作后,develop 分支就可以接收下一个大版本的功能了。

develop 分支分离出新版本分支的关键时刻是 develop 分支(几乎)反映了新版本的理想状态。至少所有针对即将发布的版本的功能都必须在此时合并到 develop 分支。而针对未来版本的所有功能则不一定,它们必须等到 release 分支分支化之后。

正是在 release 分支开始时,即将发布的版本才会被分配一个版本号,而不是更早。在此之前,develop 分支反映的是 “下一个版本” 的变更,但在 release 分支启动之前,“下一个版本” 最终是 0.3 0.3 0.3 还是 1.0 1.0 1.0 并不清楚。这个决定是在 release 分支启动时做出的,并由项目的版本号递增规则来执行。

(1)创建 release 分支

release 分支是从 develop 分支创建的。例如, 1.1.5 1.1.5 1.1.5 版是当前的生产版本,而我们即将发布一个大版本。develop 分支已经为 “下一个版本” 做好了准备,我们决定将其命名为 1.2 1.2 1.2 版(而不是 1.1.6 1.1.6 1.1.6 版或 2.0 2.0 2.0 版)。因此,我们建立了分支,并给 release 分支起了一个反映新版本号的名字:

$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)

创建新分支并切换到该分支后,我们就会提升版本号。在这里,bump-version.sh 是一个虚构的 shell 脚本,它会更改工作副本中的某些文件,以反映新版本。(当然,这也可以是手动更改,关键是某些文件会发生变化)。然后,提交被修改的版本号。

这个新分支可能会存在一段时间,直到正式发布。在此期间,错误修复可能会应用到该分支(而不是 develop 分支)。严禁在此添加大型新功能。它们必须合并到 develop 分支,因此要等到下一个大版本发布。

(2)完成 release 分支

release 分支的状态准备好成为真正的发布版本时,需要执行一些操作。首先,将 release 分支合并到 master 分支(因为 master 分支上的每次提交都是一次新的发布,切记)。其次,必须对 master 分支上的提交进行标记,以方便将来引用这个历史版本。最后,需要将 release 分支上的修改合并回 develop 分支,以便未来的版本也包含这些错误修复

Git 的前两个步骤:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

现在,发布工作已经完成,并打上了标签,以备将来参考。(你也可以使用 -s-u <key> 标记对标签进行加密签名。)

为了保留 release 分支中的改动,我们需要把它们合并回 develop 分支。在 Git 中:

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

这一步很可能导致合并冲突(甚至可能,因为我们已经更改了版本号)。如果是这样,请修复并提交。

现在我们真的完成了,release 分支也可以删除了,因为我们不再需要它了:

$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).

3.3 Hotfix branches 热修复分支

来自于 master,必须合并回 developmaster

分支命名约定:hotfix-*

在这里插入图片描述
hotfix 分支与 release 分支非常相似,都是为新的生产版本做准备,尽管是计划外的。它们产生的原因是,必须立即对实时生产版本中不希望出现的状态采取行动。当必须立即解决生产版本中的关键错误时,可以从标记生产版本的 master 分支上的相应标记中分出一个 hotfix 分支。

这样做的好处是,团队成员(在开发分支上)的工作可以继续进行,而另一个人则在准备快速的生产修复

(1)创建 hotfix 分支

hotfix 分支是从 master 分支创建的。例如, 1.2 1.2 1.2 版是当前正在运行的生产版本,由于一个严重的错误而造成了很多麻烦。但开发中的更改还不稳定。这时,我们可以分离出一个 hotfix 分支,开始修复 1.2 1.2 1.2 版本的错误。

$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)

分支后不要忘记提升版本号!

然后,修复错误并在一个或多个单独的提交中提交修复。

$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)

(2)完成 hotfix 分支

完成后,需要将漏洞修复合并回 master 分支,但同时也需要合并回 develop 分支,以确保下一个版本也包含该漏洞修复。这与 release 分支的完成方式完全类似。

首先,更新主版本并标记发布版本。

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1

可以使用 -s-u <key> 标记对标签进行加密签名。

接下来,在 develop 中也包含错误修正:

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)

这里的规则有一个例外,那就是当当前存在 release 版分支时,热修复程序的更改需要合并到 release 分支,而不是 develop 分支。将错误修正反向合并到 release 分支,最终会导致在 release 分支完成后,错误修正也被合并到 develop 分支。(如果 develop 中的工作立即需要这个错误修正,而又不能等到 release 分支完成,那么现在也可以安全地将错误修正合并到 develop 中)。

最后,删除临时分支:

$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).

4.总结

虽然这个分支模型并没有什么令人震惊的新内容,但这篇文章开头提到的 “全局” 图在我们的项目中却非常有用。它形成了一个优雅的心智模型,易于理解,并能让团队成员对分支和发布流程形成共识。

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

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

相关文章

最大子数组和【力扣53】

一、解题思路 Max[i]表示&#xff1a;以nums[i]为开头的所有连续子数组和的最大值。 由此可以推出Max[i-1]和Max[i]的关系&#xff1a; 若Max[i]>0&#xff1a;Max[i-1]nums[i-1]Max[i]&#xff1b; 否则&#xff1a;Max[i-1]nums[i-1]&#xff1b; 则ansMAX&#xff0…

RISC-V走向开放服务器规范

原文&#xff1a;RISC-V Moving Toward Open Server Specification 作者&#xff1a;Agam Shah 转载自&#xff1a;https://www.hpcwire.com/2023/07/24/risc-v-moving-toward-open-server-specification/ 中文翻译&#xff1a; 2023年7月24日 RISC-V International目前正…

亚马逊 EC2服务器下部署java环境

1. jdk 1.8 安装 1.1 下载jdk包 官网 Java Downloads | Oracle tar.gz 包 下载下来 1.2 本地连接 服务器 我用的是亚马逊的ec2 系统是 ubuntu 的 ssh工具是 Mobaxterm , 公有dns 创建实例时的秘钥 链接 Mobaxterm 因为使用的 ubuntu 所以登录的 名称 就是 ubuntu 然后 …

【Ubuntu】简化反向代理和个性化标签页体验

本文将介绍如何使用Docker部署Nginx Proxy Manager和OneNav&#xff0c;两个功能强大且易用的工具。Nginx Proxy Manager用于简化和管理Nginx反向代理服务器的配置&#xff0c;而OneNav则提供个性化的新标签页体验和导航功能。通过本文的指导&#xff0c;您将学习如何安装和配置…

程序使用Microsoft.XMLHTTP对象请求https时出错解决

程序中使用Microsoft.XMLHTTP组件请求https时出现如下错误&#xff1a; 出错程序代码示例&#xff1a; strUrl "https://www.xxx.com/xxx.asp?id11" dim objXmlHttp set objXmlHttp Server.CreateObject("Microsoft.XMLHTTP") objXmlHttp.open "…

Cesium相机理解

关于cesium相机&#xff0c;包括里面内部原理网上有很多人讲的都很清楚了&#xff0c;我感觉这两个人写的都挺好得&#xff1a; 相机 Camera | Cesium 入门教程 (syzdev.cn) Cesium中的相机—setView&lookAtTransform_cesium setview_云上飞47636962的博客-CSDN博客上面这…

【Linux】进程间通信——system V共享内存

目录 写在前面的话 System V共享内存原理 System V共享内存的建立 代码实现System V共享内存 创建共享内存shmget() ftok() 删除共享内存shmctl() 挂接共享内存shmat() 取消挂接共享内存shmdt() 整体通信流程的实现 写在前面的话 上一章我们讲了进程间通信的第一种方式…

Linux基础学习

文章目录 Linux命令学习Linux环境准备Linux命令行学习Linux命令行格式与文件系统linux实用命令笔记Linux文件权限查看 Linux命令学习 理解Linux命令是什么 &#xff08;图形化的操作&#xff0c;文件查看&#xff0c;浏览器打开&#xff09; 你打开一个谷歌浏览器&#xff0c;…

模拟实现消息队列项目(系列4) -- 服务器模块(内存管理)

目录 前言 1. 创建MemoryDataCenter 2. 封装Exchange 和 Queue方法 3. 封装Binding操作 4. 封装Message操作 4.1 封装消息中心集合messageMap 4.2 封装消息与队列的关系集合queueMessageMap的操作 5. 封装未确认消息集合waitMessage的操作 6. 从硬盘中恢复数据到内存中 7. Memo…

工具推荐:Wireshark网络协议分析工具(对比tcpdump)

文章首发地址 Wireshark是一款开源的网络协议分析工具&#xff0c;可以捕获网络数据包并对其进行详细的分析和解释。下面是Wireshark的详细介绍&#xff1a; Wireshark 工作原理 Wireshark通过捕获网络接口上的数据包&#xff0c;将其转换为可读的格式&#xff0c;并在界面…

vue3实现自定义select下拉框内容之城市区域篇

分享-2023年资深前端进阶&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 需求分析&#xff1a; 1、实现一个区域下拉选项与现有ui组件库不同&#xff0c;支持多选、单选需求 2、支持选中区域后-全选中当前区域下的所有城市信息 3、…

安卓如何卸载应用

卸载系统应用 首先需要打开手机的开发者选项&#xff0c;启动usb调试。 第二步需要在电脑上安装adb命令&#xff0c;喜欢的话还可以将它加入系统path。如果不知道怎么安装&#xff0c;可以从这里下载免安装版本。 第三步将手机与电脑用数据线连接&#xff0c;注意是数据线&a…

贝叶斯深度学习的温和介绍

一、说明 欢迎来到令人兴奋的概率编程世界&#xff01;本文是对这个领域的温和介绍&#xff0c;你只需要对深度学习和贝叶斯统计有一个基本的了解。如果像我一样&#xff0c;你听说过贝叶斯深度学习&#xff0c;并且你猜它涉及贝叶斯统计&#xff0c;但你不知道它是如何使用的&…

GPT-4助力数据分析:提升效率与洞察力的未来关键技术 | 京东云技术团队

摘要 随着大数据时代的到来&#xff0c;数据分析已经成为企业和组织的核心竞争力。然而&#xff0c;传统的数据分析方法往往无法满足日益增长的数据分析需求的数量和复杂性。在这种背景下&#xff0c;ChatGPT-4作为一种先进的自然语言处理技术&#xff0c;为数据分析带来了革命…

侯捷C++高级编程(下)

对于1个类要么像指针要么像函数 主题1:转换函数 转换函数 /** 1. 转换函数没有返回类型* 2. 转换函数一般需要加上const*/ class Fraction { public:Fraction(int num,int den1):m(num),n(den){cout<<"Fraction(int num,int den1): m/n "<< m/n<&…

【图像分类】CNN + Transformer 结合系列.4

介绍两篇利用Transformer做图像分类的论文&#xff1a;CoAtNet&#xff08;NeurIPS2021&#xff09;&#xff0c;ConvMixer&#xff08;ICLR2022&#xff09;。CoAtNet结合CNN和Transformer的优点进行改进&#xff0c;ConvMixer则patch的角度来说明划分patch有助于分类。 CoAtN…

GitHub不能正常打开以及CSS样式加载不成功的解决方案

大家好&#xff0c;今天分享GitHub不能正常打开以及CSS样式加载不成功的解决方案。当GitHub在没有“科学上网”的情况下&#xff0c;不能正常打开时&#xff0c;最直接的检测方法就是 ping 掉包情况。&#xff08;当然还有其它抓包的方法&#xff09;。通过 ping github.com可见…

专业商城财务一体化-线上商城+进销存管理软件,批发零售全行业免费更新

订货流程繁琐&#xff1f;订单处理效率低&#xff1f;小程序商城与进销存系统不打通&#xff1f;数据需要手动输入同步&#xff1f;财务与的结算对账需要大量手工处理&#xff1f;零售批发从业者&#xff0c;如何你也有以上烦恼&#xff0c;可以看看进销存小程序订货商城&#…

python几岁可以学零基础,python多大的孩子可以学

大家好&#xff0c;小编为大家解答多大的孩子可以学python的问题。很多人还不知道学python多大年龄可以学&#xff0c;现在让我们一起来看看吧&#xff01; python编程是现在很多孩子接触编程的好选择&#xff0c;它能够给孩子带来容易入门的效果。那么&#xff0c;python编程少…