Gitflow:一种依据 Git 构建的分支管理工作流程模式

2024-02-25 14:20

本文主要是介绍Gitflow:一种依据 Git 构建的分支管理工作流程模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 前言
    • Gitflow 背景
    • Gitflow 中的分支模型
    • Gitflow 的版本号管理
    • 简单模拟 Gitflow 工作流

前言

Gitflow 工作流是一种版本控制流程,主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突,并能快速地完成项目,因此在很多软件开发团队中都被广泛应用。通过使用 Gitflow 工作流,我们可以更好地管理代码的修改、版本的发布和协作,从而提高软件开发的效率和质量。在本篇文章中,我们将模拟一次典型的 Gitflow 工作流流程,让大家更好地理解这个工作流的工作流程和要点。

Gitflow 背景

“Gitflow 工作流程模型”的理念源自 Vincent Driessen(文森特·德里森)的深度研究与实践经验。在参与团队项目开发时,引入了 Gitflow 开发模型,之后又于2010年1月5日在一篇博客《A successful Git branching model》中详细阐述了该模型的理论基础及具体执行方式,并通过图表和实例进行解释,使读者能够更清晰、直观地理解并应用该模型。

这篇博客文章在软件开发领域引起了极大反响,被广泛传播和引用,为开发人员提供了一套结构严谨且可扩展的分支管理策略,从而提高工作效率和代码质量。如今,它已经成为使用 Git 进行团队协作和版本控制的开发者首要参照模型。

博客中的工作模型图如下:

3-01

Gitflow 中的分支模型

在 Gitflow 工作流程中,依据分支的寿命周期,我们可以将它们划分为长期分支短期分支

长期分支主要用于综合及管理诸多短期分支的代码,以此确保代码库的整体框架和稳定性,同时协助团队更加高效地管理和追踪各分支的进展及状态。通常,长期分支主要包括主分支(Main)和开发分支(Develop)这两部分:

  • 主分支(Main):该分支主要用于储存稳定版发布版本的代码,这是一个永不删除的分支,只会接受由 ReleaseHotfix 分支合并的代码。同时,当 Release 分支和 Hotfix分支被合并回 Main 分支后,我们会添加一个标签,以标记该版本的发布日期及版本序号等重要信息。过为每个版本打上标签,可以轻松地跟踪和回滚到特定的版本。
  • 开发分支(Develop):开发分支基于主分支建立。该分支包含了当前正进行的所有功能开发和错误修复工作,这也是一个持久性的分支。Develop 分支一般会接受来自 Feature 分支、 Release 分支和 Hotfix 分支的代码合并。

至于短期分支,主要是在项目开发历程中用于临时任务的分支,其生命周期相对较短,如:

  • 功能分支(Feature):功能分支主要用于开发新功能的开发。是从 Develop 分支创建,每个新功能都应在一个单独的 Feature 分支上进行开发,一旦功能开发完毕并通过测试,功能分支便会被合并回 Develop 分支。

  • 补丁分支(Hotfix):补丁分支则主要用于修复线上问题的分支。若在主分支 Main 上发现问题需要修复,那么我们会从 Main 分支上创建一个 Hotfix 分支进行修复,修复完成后,Hotfix 分支将被合并回 Main 分支和 Develop 分支,以保障修复过的错误能在当前和未来的版本中得以修正。

  • 发布分支(Release):发布分支用于准备发布一个稳定版的代码,在 Release 分支上进行最后的测试和修复,以确保代码质量和稳定性。一旦 Release 分支准备好发布,它将被合并回 Develop 分支和 Main 分支,以便在发布稳定版时使用。

Gitflow 的版本号管理

版本号的目的是提供一种明确和一致的方式来标识软件版本,使开发者和用户可以更清晰地了解版本的变化和影响,有助于管理依赖关系和追踪版本的演进。

目前常见的版本号格式定义是语义化版本规范,即所谓的"语义化版本控制(Semantic Versioning)",也叫作"SemVer"标准。它是一种用于标识和管理软件版本的规范,被广泛应用于软件开发。"SemVer"详细地界定了版本号的格式、具体所代表的含义以及整体更新原则,其根本宗旨就是为了让所有人都能以一致、确定的方式去描述和评估每次软件变动所带来的影响大小。

按照语义化版本控制的规范,一个版本号由三个部分组成:主版本号、次版本号和修订号,形式为 MAJOR.MINOR.PATCH ,每个部分都是非负整数,起始值为 0:

  • 主版本号(MAJOR 「大版本」):当进行不兼容的 API 变动或重大改进时增加。如果新版本与旧版本不兼容,用户可能需要修改代码才能适配新版本。
  • 次版本号(MINOR 「小版本」):当添加功能或进行向后兼容的改进时增加。新功能的引入不会破坏现有的 API,但用户可以利用新功能进行开发。
  • 修订号(PATCH 「修补版本」):用于修复 Bug 或进行其他小的改动,不会引入新的功能或破坏现有的 API。

此外,语义化版本控制还支持在版本号后面添加预发布标识和构建号。

  • 预发布标识(Pre-release):用于标识测试阶段的预发布版本,例如 alpha、beta、rc 等。预发布版本在正式发布之前进行测试和反馈。
  • 构建号(Build Metadata):用于标识每个构建的唯一编号,通常用于区分不同构建的细微差异。

例如对于版本号 v1.0.0,它代表着首个正式版本的发布。在这个版本中,可以期待有稳定的功能和已经修复的错误,但不会有任何新的重大功能引入。这个版本标记着软件的第一个里程碑,可以作为后续版本的基础。

注:版本号的具体规则和含义可能因团队或项目而异。因此在实际使用中,可以根据项目的需求和团队的约定来解释和定义版本号的含义。

简单模拟 Gitflow 工作流

假设我们有一个新的项目,需要使用 Gitflow 工作流进行代码管理和协作开发,Gitflow 工作流过程如下:

  1. 首先,在项目的开发阶段,我们需要创建一个空的 Git 仓库,并初始化为一个新的项目;从空仓库创建一个 Main 主分支,用于存储稳定版本的代码,部署生产环境:

    无标题-2024-01-09-2029

  2. 然后,基于 Main 主分支创建一个 Develop 开发分支,后续所有的开发工作都将在这个分支上进行:

    无标题-2024-01-09-2029

  3. 根据团队的需求,为开发人员分配两个开发任务:

    • 用户登录:用于允许用户在网站进行登录。此功能将作为 1.0 版本的一部分上线。
    • 在线支付:用于在网站中实现在线支付功能。此功能将作为 2.0 版本的一部分上线。

    明确功能后,基于 Develop 开发分支创建对应的 Feature 功能分支:

    无标题-2024-01-09-2029

  4. 当用户登录功能在 Feature 功能分支上开发完成后,将 Feature 功能分支合并到 Develop 开发分支:

    无标题-2024-01-09-2029

  5. 1.0 版本所需的用户登录功能开发完毕,此时 1.0 版本的功能为可发布状态,我们可以从 Develop 开发分支创建一个新的 Release 发布分支。在该分支上进行最终测试和缺陷修复:

    无标题-2024-01-09-2029

  6. 在完成测试和修复后,将 Release 发布分支合并回 Main 主分支和 Develop 开发分支。同时,在 Main 主分支上打上标签Tag,以便追踪版本:

    无标题-2024-01-09-2029

  7. 如果在生产环境中发现了紧急问题,可以直接从 Main 主分支上创建一个 Hotfix 补丁分支,并进行修复:

    无标题-2024-01-09-2029

  8. 当问题成功解决后,将 Hotfix 补丁分支同步回 Main 主分支和 Develop 开发分支,以确保修复过的错误能在当前和未来的版本中得以修复。同时,在 Main 主分支上打上新的标签Tag

    无标题-2024-01-09-2029

  9. 此时,在线支付功能开发完毕,将 Feature 功能分支合并回 Develop 开发分支:

    无标题-2024-01-09-2029

  10. 创建 Realse 发布分支准备发布 2.0 版本:

    无标题-2024-01-09-2029

  11. 合并 Main 主分支,为 Main 主分支打上标签Tag 2.0.0,同时同步 Develop 开发分支:

    无标题-2024-01-09-2029

  12. 团队成员根据需要继续创建新的功能分支、发布分支和补丁分支,推进项目的开发和维护工作。

这篇关于Gitflow:一种依据 Git 构建的分支管理工作流程模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745748

相关文章

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

使用Python和python-pptx构建Markdown到PowerPoint转换器

《使用Python和python-pptx构建Markdown到PowerPoint转换器》在这篇博客中,我们将深入分析一个使用Python开发的应用程序,该程序可以将Markdown文件转换为Pow... 目录引言应用概述代码结构与分析1. 类定义与初始化2. 事件处理3. Markdown 处理4. 转

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带