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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke