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

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

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

相关文章

Android res/values/locale_config.xml文件

Android res/values/locale_config.xml文件 各个国家/地区在android系统里面的缩写代码。最典型的用途是本地化。 <?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2015 The Android Open Source ProjectLicensed under the Apache L…

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x

How to implement multiple file uploads based on Swagger 3.x in Spring boot 3.x Projectpom.xmlOpenAPIConfigFileUploadControllerapplication.yaml Project pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://…

安全防御-第六次

内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应用层&…

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记

在ROS中&#xff0c;计算图&#xff08;ROS Compute Graph&#xff09;是一个核心概念&#xff0c;它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络&#xff0c;它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…

使用 JMeter 生成测试数据对 MySQL 进行压力测试

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

算法沉淀——动态规划之子序列问题(下)(leetcode真题剖析)

算法沉淀——动态规划之子序列问题 01.最长定差子序列02.最长的斐波那契子序列的长度03.最长等差数列04.等差数列划分 II - 子序列 01.最长定差子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/ 给你一个整数数…

Promise 介绍与基本使用 - 学习笔记

Promise 介绍与基本使用 1、 Promise 是什么&#xff1f;2、创建 Promise 实例对象3、Promise 实例方法4、Promise 的基本工作流程5、实例方法6、静态方法7、async 和 await7.1、关键字7.2、实例7.3、区别7.4、为什么使用 async/await 比较好&#xff1f; 1、 Promise 是什么&a…

【Vite】解决Vite http proxy error: Error: connect ECONNREFUSED

今天写bug&#xff0c;发现了这个问题 我经过我一晚上的搜索努力&#xff0c;在github上找到了解决办法&#xff0c;不得不说&#xff0c;交友网站还是很好用的。 参考 这一行是关键代码。 因为我连的是本地后台服务&#xff0c;所以最后配置成这样 server: {open: true,pro…

Linux浅学笔记04

目录 Linux实用操作 Linux系统下载软件 yum命令 apt systemctl命令 ln命令 日期和时区 IP地址 主机名 网络传输-下载和网络请求 ping命令 wget命令 curl命令 网络传输-端口 进程 ps 命令 关闭进程命令&#xff1a; 主机状态监控命令 磁盘信息监控&#xff1a…

大数据之Flink优化

文章目录 导言&#xff1a;Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

机器学习:SVM算法(Python)

一、核函数 kernel_func.py import numpy as npdef linear():"""线性核函数:return:"""def _linear(x_i, x_j):return np.dot(x_i, x_j)return _lineardef poly(degree3, coef01.0):"""多项式核函数:param degree: 阶次:param …

K8S-001-Virtual box - Network Config

A. 配置两个IP&#xff0c; 一个连接内网&#xff0c;一个链接外网: 1. 内网配置(Host only&#xff0c; 不同的 virutal box 的版本可以不一样&#xff0c;这些窗口可能在不同的地方&#xff0c;但是配置的内容是一样的): 静态IP 动态IP 2. 外网&#xff08;创建一个 Networ…

【Linux】进程优先级以及Linux内核进程调度队列的简要介绍

进程优先级 基本概念查看系统进程修改进程的优先级Linux2.6内核进程调度队列的简要介绍和进程优先级有关的概念进程切换 基本概念 为什么会存在进程优先级&#xff1f;   进程优先级用于确定在资源竞争的情况下&#xff0c;哪个进程将被操作系统调度为下一个运行的进程。进程…

【Ubuntu】使用WSL安装Ubuntu

WSL 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能&#xff0c;可用于在 Windows 计算机上运行 Linux 环境&#xff0c;而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。安装 Linux 发行版时&#xff0c…

数据库架构师之道:MySQL安装与系统整合指南

目录 MySQL数据库安装&#xff08;centos&#xff09; 版本选择 企业版 社区版 选哪个 MySQL特点 MySQL服务端-客户端 mysql下载选择 软件包解释 安装MySQL的方式 rpm包安装 yum方式安装 源码编译安装★ 具体的编译安装步骤★★ 环境准备 free -m命令 cat /pr…

基于java Springboot实现课程评分系统设计和实现

基于java Springboot实现课程评分系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; &#x1f31e;详见如下专栏&#x1f31e; &…

我在代码随想录|写代码Day27 | 贪心算法 | 122.买卖股票的最佳时机 II,55. 跳跃游戏, 45.跳跃游戏 II

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: <<数据结构与算法>> 专题 : 数据结构帮助小白快速入门算法 &…

代码随想录算法训练营29期|day64 任务以及具体安排

第十章 单调栈part03 有了之前单调栈的铺垫&#xff0c;这道题目就不难了。 84.柱状图中最大的矩形class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st new Stack<Integer>();// 数组扩容&#xff0c;在头和尾各加入一个元素int [] ne…