git flow与分支管理

git flow与分支管理

  • 一、git flow是什么
  • 二、分支管理
    • 1、主分支Master
    • 2、开发分支Develop
    • 3、临时性分支
      • 功能分支
      • 预发布分支
      • 修补bug分支
  • 三、分支管理最佳实践
    • 1、分支名义规划
    • 2、环境与分支
    • 3、分支图
  • 四、git flow缺点

一、git flow是什么

Git 作为一个源码管理系统,不可避免涉及到多人协作。

协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去。“工作流程"在英语里,叫做"workflow"或者"flow”,原意是水流,比喻项目像水流那样,顺畅、自然地向前流动,不会发生冲击、对撞、甚至漩涡。

gitflow1
最早诞生、并得到广泛采用的一种工作流程,就是 Git flow 。

首先,项目存在两个长期分支。

  • 主分支master
  • 开发分支develop
    gitflow2

前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版;后者用于日常开发,存放最新的开发版。

其次,项目存在三种短期分支。

  • 功能分支(feature branch)
  • 补丁分支(hotfix branch)
  • 预发分支(release branch)

一旦完成开发,它们就会被合并进develop或master,然后被删除。
gitflow3

二、分支管理

Git只生成一个指向当前版本(又称"快照")的指针,因此非常快捷易用。但是,太方便了也会产生副作用。如果你不加注意,很可能会留下一个枝节蔓生、四处开放的版本库,到处都是分支,完全看不出主干发展的脉络。

分支脉络
Vincent Driessen提出了一个分支管理的策略,非常值得借鉴。它可以使得版本库的演进保持简洁,主干清晰,各个分支各司其职、井井有条。理论上,这些策略对所有的版本管理系统都适用,下文中Git只是用来举例而已,如果你不熟悉Git,跳过举例部分即可。

1、主分支Master

首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
在这里插入图片描述
Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。

2、开发分支Develop

主分支只用来发布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。
在这里插入图片描述
这个分支可以用来生成代码的最新隔夜版本(nightly)。如果想正式对外发布,就需要切换到Master分支上对Develop分支进行"合并"(merge)。

// Git创建Develop分支的命令:
git checkout -b develop master// 将Develop分支发布到Master分支的命令
# 切换到Master分支  
git checkout master# 对Develop分支进行合并  
git merge --no-ff develop

这里稍微解释一下,上一条命令的–no-ff参数是什么意思。默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。

fast-farward merge–no-ff
在这里插入图片描述在这里插入图片描述

使用–no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。关于合并的更多解释,请参考Benjamin Sandofsky的《Understanding the Git Workflow》。

3、临时性分支

前面讲到版本库的两条主要分支:Master和Develop。前者用于正式发布,后者用于日常开发。其实,常设分支只需要这两条就够了,不需要其他了。

但是,除了常设分支以外,还有一些临时性分支,用于应对一些特定目的的版本开发。临时性分支主要有三种:

  • 功能(feature)分支
  • 预发布(release)分支
  • 修补bug(fixbug)分支

这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。

功能分支

第一种是功能分支,它是为了开发某种特定功能,从Develop分支上面分出来的。开发完成后,要再并入Develop。
在这里插入图片描述
功能分支的名字,可以采用feature-*的形式命名。

// 创建一个功能分支:
git checkout -b feature-x develop// 开发完成后,将功能分支合并到develop分支:
git checkout develop
git merge --no-ff feature-x// 删除feature分支:
git branch -d feature-x

预发布分支

第二种是预发布分支,它是指发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。

预发布分支是从Develop分支上面分出来的,预发布结束以后,必须合并进Develop和Master分支。它的命名,可以采用release-*的形式。

// 创建一个预发布分支:
git checkout -b release-1.2 develop// 确认没有问题后,合并到master分支:
git checkout master
git merge --no-ff release-1.2// 对合并生成的新节点,做一个标签  
git tag -a 1.2// 再合并到develop分支:
git checkout develop
git merge --no-ff release-1.2// 最后,删除预发布分支:
git branch -d release-1.2

修补bug分支

最后一种是修补bug分支。软件正式发布以后,难免会出现bug。这时就需要创建一个分支,进行bug修补。

修补bug分支是从Master分支上面分出来的。修补结束以后,再合并进Master和Develop分支。它的命名,可以采用fixbug-*的形式。
在这里插入图片描述

// 创建一个修补bug分支:
git checkout -b fixbug-0.1 master// 修补结束后,合并到master分支:
git checkout master
git merge --no-ff fixbug-0.1
git tag -a 0.1.1// 再合并到develop分支:
git checkout develop
git merge --no-ff fixbug-0.1// 最后,删除"修补bug分支":
git branch -d fixbug-0.1

三、分支管理最佳实践

1、分支名义规划

分支/tag名命名规则描述
master分支
主分支
master,固定不变永远是可用的、稳定的、可直接发布的版本,不能直接在该分支上开发。
用于迁移feature和hotfix分支,也用于打上线快照r_tag,用于上线
feature-xxx
功能开发分支
feature-{name},以开发功能模块命名
不能有大写字母,多个单词之间用下划线替代
由RD从master分支迁出,开发完成后合并到dev分支,提测的时候合并到qa分支,上线集成的时候需要合并到release分支。用于新需求或功能的开发也用于dev环境泳道1的部署(非主干泳道的部署,主干泳道只能用master部署)
qa
测试主分支
qa,固定不变提测分支,qa分支只能由feature做merge合并,不能直接在该分支上开发,用于QA测试
release-xxx
发布分支
release-${yyyyMMdd},以yyyyMMdd格式命名,如果一天有多个分支后面增加24单位的双位小时时间yyMMddHHrelease分支是测试完成后,由RD或QA创建,从master迁,并将feature分支merge到release分支。主要是用在预发环境集成测试。
release-xxx-bug
功能bug修复分支
release-${yyyyMMdd}-bug,参考release-xx分支的命名在release上创建分支修复,修复好提测的bug之后合并回release分支
hotfix-xxx
紧急bug修改分支
hotfix-{name},以修复bug的名称命名。不能有大写字母,多个单词之间用下划线替代项目上线之后可能会遇到一些环境问题需要紧急修复,流程跟release分支相似,修复完成要上线的时候合并master分支
b-tag TAGb-{yyyyMMdd}-{name},不能有大写字母,多个单词之间用下划线替代b-tag从release分支打出,用于灰度上线验证
r-tag TAGr-{yyyyMMdd}-{name},不能有大写字母,多个单词之间用下划线替代r-tag用于上线的tag,由QA同学创建。灰度上线验证通过,会将release合并到master分支,从master打出r-tag
hotfix分支hotfix/{yyyyMMdd}-{bug},不能有大写字母,多个单词之间用下划线替代用于线上bug的修复,从master分支迁出

2、环境与分支

固定代码分支与服务部署环境的关联关系如下表所示。

环境代码分支tag备注
prodmasterrtag生产环境,即线上服务,上线应使用从master分支打出的r_tag上线
stagingreleasebtagstaging环境,用master代码分支和配置进行验证,上线前的最后检查
testqa测试环境,用于支持QA同事做功能测试,部署权限需联系接口QA。
devfeature开发环境,用于研发同事之间做接口联调、功能测试。

3、分支图

在这里插入图片描述

四、git flow缺点

Git flow的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支。大多数工具都将master当作默认分支,可是开发是在develop分支进行的,这导致经常要切换分支,非常烦人。

更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本。但是,很多网站项目是"持续发布",代码一有变动,就部署一次。这时,master分支和develop分支的差别不大,没必要维护两个长期分支。

分支太多,所以会出现 git log 混乱的局面。具体来说,主要是 git-flow 使用git merge --no-ff来合并分支,在 git-flow 这样多个分支的环境下会让你的分支管理的 log 变得很难看。如下所示,左边是使用–no-ff 参数在多个分支下的问题。
在这里插入图片描述
所谓–no-ff参数的意思是——no fast forward的意思。也就是说,合并的方法不要把这个分支的提交以前置合并的方式,而是留下一个 merge 的提交。这是把双刃剑,我们希望我们的–no-ff能像右边那样,而不是像左边那样。对此的建议是:只有 feature 合并到 developer 分支时,使用–no-ff 参数,其他的合并都不使用–no-ff参数来做合并。另外,还有一个问题就是,在开发得足够快的时候,你会觉得同时维护 Master 和 Developer 两个分支是一件很无聊的事,因为这两个分支在大多数情况下都是一样的。包括 Release 分支,你会觉得创建的这些分支太无聊。而你的整个开发过程也会因为这么复杂的管理变得非常复杂。尤其当你想回滚某些人的提交时,你就会发现这事似乎有点儿不好干了。而且在工作过程中,你会来来回回地切换工作的分支,有时候一不小心没有切换,就提交到了不正确的分支上,你还要回滚和重新提交,等等。

Git Flow 抛弃了 rebase如果你要使用 Git Flow,就得放弃 rebase。rebase 取消了合并提交——也就是可以看到两个分支合并的地方。由于 Git Flow 的复杂性,你需要可视化跟踪分支,这意味着如果你想要看到来龙去脉,就不能使用 rebase。


  1. 泳道环境是什么? ↩︎

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

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

相关文章

【转载】原生社区交友婚恋视频即时通讯双端APP源码 ONE兔2.0版

原生社区交友婚恋视频即时通讯双端APP源码下载ONE兔2.0版 包含后端、H5源码源码,Android源码,IOS源码

LeetCode983. Minimum Cost For Tickets——动态规划

文章目录 一、题目二、题解 一、题目 You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array days. Each day is an integer from 1 to 365. Train tickets are sold in three differen…

3.4-媒资管理之视频处理+xx-job分布式任务

文章目录 媒资管理6 视频处理6.1 需求6.1.1 总体需求6.7.3 FFmpeg 的基本使用6.7.4 视频处理工具类 6.2 分布式任务处理6.2.1 什么是分布式任务调度6.2.2 XXL-JOB介绍6.2.3 搭建XXL-JOB6.2.3.1 调度中心6.2.3.2 执行器6.2.3.3 执行任务 6.2.4 分片广播 6.3 技术方案6.3.1 作业分…

Java基础常见面试题总结-集合(一)

常见的集合有哪些? Java集合类主要由两个接口Collection和Map派生出来的,Collection有三个子接口:List、Set、Queue。 Java集合框架图如下: List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表…

8个简约精美的WordPress外贸网站主题模板

Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板,简洁实用的外贸公司wordpress外贸建站模板。 查看演示 Invisible Trade WP外贸网站模板 WordPress Invisible Trade外贸网站模板,做进出口贸易公司官网的wordpress网站模板。 查看演…

Vue3编写简单的App组件(二)

一、Vue3页面渲染基本流程 1、入口文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content"widthde…

算法学习系列(三十二):背包问题

目录 引言一、01背包1.二维代码模板2.一维代码模板 二、完全背包1.朴素代码模板2.二维优化代码模板3.一维代码模板 三、多重背包1.朴素做法2.优化版本 四、分组背包1.朴素做法2.一维优化 引言 从这一篇文章开始&#xff0c;就开始学习动态规划了&#xff0c;也就是DP了&#x…

js手写Promise(下)

目录 resolve与reject的调用时机封装优化 回调返回PromiseisPromise手动调用then 微队列catchresolverejectall传入的序列为空传入的值非Promise race完整的Promise代码 如果没有看过上半部分的铁铁可以看看这篇文章 js手写Promise&#xff08;上&#xff09; resolve与reject…

MacOS 设置 环境变量

1. 以TextEdit 的方式打开 ~/.bash_profile 文件 touch ~/.bash_profile; open -t ~/.bash_profile 2.新增环境变量 export PATH"$HOME/.rbenv/bin:$PATH" 3.让以上所作的配置生效 source ~/.bash_profile 4.查看是否生效&#xff08;有时可能须要关闭当前 T…

Go Context -- 管理请求的上下文信息

在Go语言中&#xff0c;管理请求的上下文信息对于构建可靠的并发程序至关重要。context 包为我们提供了一种优雅的方式来传递请求的取消信号、超时信息和请求范围的值。接下来将深入探讨Go中的 context 包&#xff0c;包括其基本概念、用法、实际应用场景和最佳实践&#xff0c…

在Visual Studio中引用和链接OpenSceneGraph (OSG) 库

在Visual Studio中引用和链接OpenSceneGraph (OSG) 库&#xff0c;按照以下步骤操作&#xff1a; 构建或安装OSG库 下载OpenSceneGraph源代码&#xff08;如3.0版本&#xff09;并解压。使用CMake配置项目&#xff0c;为Visual Studio生成解决方案文件。通常您需要设置CMake中的…

Office2013下载安装教程,保姆级教程,附安装包和工具

前言 Microsoft Office是由Microsoft(微软)公司开发的一套基于 Windows 操作系统的办公软件套装。常用组件有 Word、Excel、PowerPoint、Access、Outlook等。 准备工作 1、Win7 及以上系统 2、提前准备好 Office 2013 安装包 安装步骤 1.鼠标右击【Office2013(64bit)】压缩…

Vue中 常用的修饰符有哪些

Vue是一款建立在JavaScript框架上的开源前端库&#xff0c;已经成为当今前端开发人员最喜爱的选择之一。它的简洁语法和强大的功能使得开发者可以轻松地构建交互性的网页应用程序。在Vue中&#xff0c;修饰符是一个重要的概念&#xff0c;它们可以帮助我们更好地控制和定制DOM元…

PV、UV、IP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. PV1.1 PV 计算1.2 PV 的影响因素 2. UV2.1 UV 计算2.2UV 的影响因素 3. IP3.1 IP和UV①UV大于IP②UV小于IP 三者的关系PV 和 UV 前言 PV、UV、IP是我们在运…

92.使用数组形式的责任链模式实现项目配置初始化

文章目录 前言示例 前言 Golang 中&#xff0c;可以使用接口&#xff08;interface&#xff09;来实现一种配置模式&#xff0c;其中配置对象实现一个接口&#xff0c;并提供一个Apply()方法来应用配置。这样&#xff0c;可以使用不同的配置对象来配置不同的行为&#xff0c;而…

深度学习入门笔记(九)自编码器

自编码器是一个无监督的应用&#xff0c;它使用反向传播来更新参数&#xff0c;它最终的目标是让输出等于输入。数学上的表达为&#xff0c;f(x) x&#xff0c;f 为自编码器&#xff0c;x 为输入数据。 自编码器会先将输入数据压缩到一个较低维度的特征&#xff0c;然后利用这…

Vue3.0(五):Vue-Router 4.x详解

Vue-Router详解 vue-router教程 认识前端路由 路由实际上是网络工程中的一个术语 在架构一个网络的时候&#xff0c;常用到两个很重要的设备—路由器和交换机路由器实际上就是分配ip地址&#xff0c;并且维护着ip地址与电脑mac地址的映射关系通过映射关系&#xff0c;路由器…

读懂 FastChat 大模型部署源码所需的异步编程基础

原文&#xff1a;读懂 FastChat 大模型部署源码所需的异步编程基础 - 知乎 目录 0. 前言 1. 同步与异步的区别 2. 协程 3. 事件循环 4. await 5. 组合协程 6. 使用 Semaphore 限制并发数 7. 运行阻塞任务 8. 异步迭代器 async for 9. 异步上下文管理器 async with …

解释Java中的事务管理,以及事务的隔离级别是什么?

解释Java中的事务管理&#xff0c;以及事务的隔离级别是什么&#xff1f; 在Java中&#xff0c;事务管理是一种机制&#xff0c;用于管理对数据库进行的一系列操作&#xff0c;以确保这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;保持数据的一致性和完整…

STM32 的优势与不足

STM32 的优势和不足如下&#xff1a; 优势&#xff1a; ① 性能&#xff1a;STM32 采用了 ARM Cortex-M 核&#xff0c;具有高性能、低功耗、低成本等特点&#xff0c;可以满足各种嵌入式系统应用的需求。 ② 生态系统&#xff1a;STM32 具有完善的生态系统&#xff0c;包括各种…