【Git必看系列】—— 2024年前后端开发必须要知道的GitFlow工作流

自从 Linux 之父Linus Torvalds对当时的版本控制工具感到不满,亲自动手创造了 Git 以来,Git 已经逐渐在版本控制领域占据了主导地位。不论你的代码仓库托管在 GitHub 还是 GitLab,不论你用的是 SourceTreeGitKraken 这样的图形界面,还是喜欢直接敲 Git 命令,这些都没问题。因为 Git 带来的便捷性和高效性,我们已经越来越离不开它了。

然而,随着项目规模的增长和协作人数的增加,有些人发现 Git 用起来似乎越来越复杂:有时候合并时会遗漏文件,有时明明删掉的文件又重新出现,甚至每次合并都要解决几十上百个冲突。这时,你可能会怀疑 Git 的能力,心里嘀咕:“这 Git 压根儿就驾驭不了咱们这么庞大的项目。“

幸好,这个世界上只要有新的好工具,就会有一群懒惰的工程师开始想方设法地让自己的生活好过一点。Vincent Driessen 就是这种人,于是他根据自己的经验,将工作中经常会遇到的场景逐一整理,根据 git 的特性,制定了一套工作规范,也就是本文的主角:Git Flow

GitFlow 是一种 Git 工作流,这个工作流程围绕着项目的发布(release)定义了一个严格的如何建立分支的模型。它是团队成员遵守的一种代码管理方案 。

Git建分支是非常容易的,我们可以任意建立分支,对任意分支再分支,分支开发完后再合并。 比较推荐、也比较常见的做法是功能(特性)驱动(Feature Driven)的建立分支法(Feature Branch Workflow)。 简而言之,就是每一个功能(feature)的开发并不直接在主干上开发,而是在单独的分支上开发,分支开发完毕后再合并到主干上。

这样做的好处是: 1. 还处于半成品状态的功能不会影响到主干。 2. 各开发人员之间在自己的功能分支上进行开发,互不干扰。 3. 主干永远处于可编译、可运行的状态。GitFlow则在这个基础上更进一步,规定了如何建立、合并分支,如何发布,如何维护历史版本等工作流程。

上号!直接开始
在这里插入图片描述
简单理解版本:
刚开始的时候,我们有个master分支,我们要基于master来创建develop
在这里插入图片描述

master
master分支上存放的是最稳定的版本,并且该分支的代码是随时可以让用户使用的代码,就是非常非常稳定的代码。当一个版本开发完成之后,交付给客户的时候,master上面的代码也要被更新。同时,每次更新都要打上相应的tag

任何人不允许在master上进行代码的直接push提交,只接受其他分支合入。原则上master分支必须是release的分支合过来的代码。

来源只能是:hotfixrelease分支。不能是其他分支。

master一定是经过多轮测试,但是不能保证完全没有bug,所以引入hotfix分支,来修复未知bug
develop
develop是主开发分支,这个分支上被合并的代码始终是下一个版本需要加入的feature。这个分支可以合并一些feature。当要release的时候,就从这个分支上进行创建release分支。

合并到develop分支上的必须保证功能完整,不影响develop分支的正常运行。
在这里插入图片描述

feature
feature 分支又叫功能分支,一般命名方法feature/xxx,用来开发版本或者未来要发布新的功能或者探索新功能。(feature 分支功能要保证里面的commit 粒度要非常细,避免和主分支脱节严重,应该大功能切成一个一个小功能来merge,而不是一次merge一个大的)
在这里插入图片描述

Release
这个分支又叫预发布分支,一般命名为 release/1.1.x 这个分支转为发布做准备。允许小量级的bug修复。

release分支只能从develop分支拉过来,用来修复一些bug。(不做feature相关的开发)
在这里插入图片描述

hotfix
hotfix 叫热修复分支,一般命名为hotfix/4.1.3 为固定某个版本进行修复,当master上遇到严重问题需要修复的时候,就要从master上指定tag拉取。这样做就是为了隔离feature开发和bug修复。

hotfix只能从master上拉去,测试通过之后合并会masterdevelop
在这里插入图片描述

详细版:
在这里插入图片描述
我们省去理论介绍的部分,直接从工作中一个平凡无奇的早晨开始,大家跟着叙述场景,一起看看 Git Flow 到底怎么帮助我们梳理工作流程,节省时间的。

假设,你们已经有了masterdevelop 两个常驻型分支,其他分支都没有。早上你泡好咖啡,从你的座位上坐下,决定好今天要为这个项目加上一个发 email 的新功能,这时,你应该创建一个新的特性分支,并命名为add_email

黄色为 develop 分支,蓝色为 master 分支
图中绿色的点代表了release分支短暂的一生。一旦开启release分支,就进入了发布前的最终测试阶段。

也有人将release分支仅视为进入master之前的缓冲区,所有的最终测试都是针对master进行的,一旦发现问题就新开分支修复。

这两种做法各有优缺点,我认为都挺好,但有一条必须严格遵守

-release分支只能修 bug,不能添加新功能。

一旦开了release分支,就只能修复 bug,不能再加新功能。 这一点非常重要,因此重复三遍。实践中,总有人喜欢在 bug 修复中夹带新功能,但要知道,此时往往缺乏全面回归测试的支持。这相当于在即将发布的版本中,悄悄植入未经充分验证的新功能,等同于埋下了随时可能爆炸的炸弹。

一旦在正式环境中发现问题需要修复,这时就需要使用hotfix分支了。
在这里插入图片描述

黄色为 develop 分支,蓝色为 master 分支

图中的红色圆圈就是hotfix,它从master分支切出,结束时同样要合并到master,并顺便同步到develop,流程和release分支类似。

实际上,我们在处理hotfix时,也要像对待release一样: 开分支的同时就要确定版本号,只能修复 bug,不能夹带新功能。 理由很简单,hotfixrelease跟正式环境运行的代码版本基本是一样的,因此对它们的谨慎程度也应该相同。而且由于hotfix通常紧急,更难以进行全面的回归测试(即使有回归测试,也不能完全保证无误)。因此,为了避免更大的损失,一定要慎之又慎

测试完毕,hotfix,重新上线,同时修复了develop,世界又回到了最初简单的状态,只剩下developmaster两个分支。

我认为,越是庞大的产品,越是要有简单的架构;越是复杂的工作,越是要用简单的方法处理。有了 gitflow,你可以有一套简单的标准去套用工作上的场景。因为这套工作流程比较简单,所以你并不应该等到事情变得复杂才来解决。请容我换个方式再讲一次:

  • gitflow 的目的是要用简单的流程解决工作上的问题,所以不要把问题放到很复杂了才想要来解决。

原则切记:

  • feature 分支的生命周期不宜过长,最多最多不要超过一个迭代周期
  • 如果一个feature 分支包含的功能太多太复杂,开发周期太长,应该拆成几个小的feature
  • 发版前必须切出release分支,预上线的测试版本一定要和实际上线的版本一致
  • release分支上只能做 bug 修复。
  • hotfixrelease分支开启时即要决定版本号,且同样只准修复 bug,不可加入新功能。
  • 经常存在的分支只有两个:developmaster

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

华为 HCIP-Datacom H12-821 题库 (25)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.以下哪些事件会导致 IS-IS 产生一个新的 LSP? A、邻接 Up 或Down B、引入的 IP 路由发送变…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.1-2.2

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)2.1 为什么要进行实例探究?(Why look at case studies?&…

PyTorch深度学习快速入门教程【土堆】基础知识篇

Juptyer 版本: Python 3.9.19Pytorch 2.4.1 (pytorch0) C:\Users\25694>conda install nb_conda_kernels(pytorch0) C:\Users\25694>jupyter notebook使用conda环境的pytorch: 成功解决python.exe无法找到程序入口 无法定位程序输入点 shifte…

【Python语言初识(一)】

一、python简史 1.1、python的历史 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面),可以调…

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…

【C++ 学习】多态的基础和原理(10)

目录 前言1. 概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数重写2.4 虚函数重写的例外2.4.1 协变2.4.1 析构函数的重写 2.5 多态调用和普通调用2.6 函数重写/函数隐藏/函数重载 的对比2.6.1 函数重写2.6.2 函数隐藏2.6.3 函数重载 2.7 C11 final 和override 3…

领域驱动DDD三种架构-分层架构、洋葱架构、六边形架构

博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围: 目前专注java体系,以及…

作为HR,如何考察候选人的沟通能力

如何考察候选人的沟通能力。沟通能力,这个听起来简单,实际上却是一个非常复杂的技能,它关乎到一个人能否有效地传递信息,理解他人,并且在团队中发挥积极的作用。 作为HR,我们应该怎样才能精准地把握住候选…

【Python语言初识(二)】

一、分支结构 1.1、if语句 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的单词,像if和else就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他…

网络:UDP协议

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题,也就是交给哪个进程?怎么确定把报文收全了?UDP报头是如何封装的呢&…

mybatisplus的多记录操作 批量删除和批量查询

1.批量查询 通过in查询 Testpublic void testBatchSelectByIds(){List<Integer> ids Arrays.asList(5,7);List<User> users userMapper.selectBatchIds(ids);log.info(users);} 2.批量删除 Testpublic void testBatchDelete(){List<Integer> ids Arrays…

VM VirtualBox虚拟机装Win11提示这台电脑不符合要求,怎么解决?

环境&#xff1a; VM VirtualBox WIN11 问题描述&#xff1a; VM VirtualBox虚拟机装WIN11提示这台电脑不符合要求 解决方案&#xff1a; 1.进入这个页面 2. 跳过win11安全验证 在键盘上按 Shift F10或者FnShift F10调出命令命令提示符&#xff0c; 键入 Regedit 并…

大数据处理从零开始————3.Hadoop伪分布式和分布式搭建

1.伪分布式搭建&#xff08;不会用&#xff0c;了解就好不需要搭建&#xff09; 这里接上一节。 1.1 伪分布式集群概述 伪分布式集群就是只有⼀个服务器节点的分布式集群。在这种模式中&#xff0c;我们也是只需要⼀台机器。 但与本地模式不同&#xff0c;伪分布式采⽤了分布式…

使用Locust进行接口性能测试:关联与参数化技巧分析

Locust是一款开源的Python性能测试工具&#xff0c;它可以模拟大量并发用户对网站或者其他接口进行压力测试 1. 关联&#xff1a;精确模拟用户操作 在某些场景下&#xff0c;我们需要将之前请求的响应参数关联到后续请求中&#xff0c;以模拟用户操作。这在会话管理&#xff…

数字工厂管理系统与MES系统在实际应用中有哪些区别

随着制造业的数字化转型步伐加快&#xff0c;数字工厂管理系统与制造执行MES系统作为两大关键工具&#xff0c;在实际应用中展现出了明显的差异。本文将从实际应用的角度&#xff0c;详细探讨这两种系统之间的主要区别。 数字工厂管理系统的实际应用 数字工厂管理系统侧重于对…

python检测keycloak证书连接报错问题

最近一直被keycloak的证书问题困扰了很久&#xff0c;老是提示ssl安全连接&#xff0c;由于不会java,只好硬着头皮用python测试。 我这里的证书是自己签注的证书&#xff0c;导入系统的是CA根证书。 from keycloak import KeycloakOpenID# 1. 配置 Keycloak 客户端 keycloak_o…

STM32F407ZGT6驱动sd卡+文件夹 并写入多组实时数据 基于cubemx生成

SD卡介绍 SD卡&#xff0c;全称Secure Digital卡&#xff0c;是一种常见的便携式存储设备&#xff0c;通常用于存储和传输数据。它是一种闪存存储卡。 TF卡&#xff08;TransFlash卡&#xff09; 又称MicroSD卡&#xff0c;MicroSD卡比SD卡小&#xff0c;通常只有SD卡的1/4大小…

LLM(大语言模型)和AIGC入门学习路线图,零基础入门到精通,收藏这一篇就够了

大模型是指网络规模庞大的深度学习模型&#xff0c;其参数量通常在千亿级别。 学习大模型需要具备计算机基础&#xff0c;这一点非常重要&#xff01; 要系统地入门大模型&#xff0c;首先需要学习深度学习的基础知识&#xff0c;包括神经网络&#xff08;NN&#xff09;、卷…

nvm node管理工具常用指令

注&#xff1a;使用nvm之前需要卸载掉原有的node 1.在终端输入 nvm list available&#xff0c; 查看网络可以安装的版本。 点击visit后面的链接可查看完整版本列表 版本区别&#xff1a; CURRENT&#xff1a;当前正在使用的 Node.js 版本。LTS&#xff08;Long Term Suppor…

java踩坑

1.mybatis在idea可以正常运行&#xff0c;但是打jar包后&#xff0c;就报链接超时&#xff0c;可能是参数设置有问题&#xff0c;但是idea自动忽略了。 出问题的配置&#xff1a;&#xff08;圈出来的地方乱码了&#xff0c;idea有纠错能力&#xff0c;它自动调整为正确的&…