GitFlow工作流

news2024/12/26 14:30:26

1.背景介绍

什么是Git工作流?

Git工作流你可以理解为工作中团队成员遵守的一种代码管理方案,在Git中有以下几种工作流方案作为方案指导。

1、集中式工作流

2、功能分支工作流

3、Gitflow工作流

4、Forking工作流

2.知识剖析

1、集中式工作流

这种工作方式跟svn类似,它只有一个master分支,开发者会先把远程的仓库克隆到本地,之后的修 改和提交都在本地操作,直到在某个合适的时间点将本地的代码合入到远程master。这种工作流比 较适合小团队,因为小团队可能不会太多的协作和合流的动作。

2、功能分支工作流

这种工作流关注功能开发,不直接往master提交代码保证它是稳定并且干净的,而是从master拉 取feature分支进行功能开发,团队成员根据分工拉取不同的功能分支来进行不同的功能开发,这样 就可以完全隔离开每个人的工作。当功能开发完成后,会向master分支发起Pull Request,只有审 核通过的代码才真正允许合入master,这样就加强了团队成员之间的代码交流。

3、Gitflow工作流

它会相对复杂一点,但它非常适合用来管理大型项目的发布和维护,后面也会详细讲下这一块。 贯穿整个开发周期,master和develop分支是一直存在的,master分支可以被视为稳定的分支, 而develop分支是相对稳定的分支,特性开发会在feature分支上进行,发布会在release分支上 进行,而bug修复则会在hotfix分支上进行。

4、Forking工作流

Forking工作流对于开源项目贡献者一定不陌生了,它有一个公开的中央仓库,其他贡献 者可以Fork(克隆)这个仓库作为你自己的私有仓库,开源项目维护者可以直接往中央仓库 push代码,而代码贡献者只能将代码push到自己的私有仓库,只有项目维护者接受代码贡献 者往中央仓库发起的pull request才会真正合入。

3.常见问题

Gitflow工作流的工作方式?

4.解决方案

Gitflow工作流是经典模型,处于核心位置,体现了工作流的经验和精髓。

Gitflow工作流通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。

1、历史分支

相对使用仅有的一个master分支,Gitflow工作流使用2个分支来记录项目的历史。 master分支存储了正式发布的历史,而develop分支作为功能的集成分支。 这样也方便master分支上的所有提交分配一个版本号。

2、功能分支

每个新功能位于一个自己的分支,这样可以push到中央仓库以备份和协作。 但功能分支不是从master分支上拉出新分支,而是使用develop分支作为父分支。 当新功能完成时,合并回develop分支。 新功能提交应该从不直接与master分支交互。 从各种含义和目的上来看,功能分支加上develop分支就是功能分支工作流的用法。但Gitflow工作流没有在这里止步。

3、发布分支

一旦develop分支上有了做一次发布(或者说快到了既定的发布日)的足够功能,就从develop分支上checkout一个发布分支。 新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上—— 这个分支只应该做Bug修复、文档生成和其它面向发布任务。 一旦对外发布的工作都完成了, 发布分支合并到master分支并分配一个版本号打好Tag。 另外,这些从新建发布分支以来的做的修改要合并回develop分支。

使用一个用于发布准备的专门分支,使得一个团队可以在完善当前的发布版本的同时,另一个团队可以继续开发下个版本的功能。 这也打造定义良好的开发阶段。

4、维护分支

维护分支或说是热修复(hotfix)分支用于生成快速给产品发布版本(production releases)打补丁, 这是唯一可以直接从master分支fork出来的分支。 修复完成,修改应该马上合并回master分支和dev elop分支(当前的发布分支),master分支应该用新的版本号打好Tag。

为Bug修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或是等待下一个发布循环。 你可以把维护分支想成是一个直接在master分支上处理的临时发布。

5.编码实战

由于本次均为理论性内容,所以以示例为主

下面的示例演示本工作流如何用于管理单个发布循环。假设你已经创建了一个中央仓库。

1、创建开发分支:

第一步为master分支配套一个develop分支。简单来做可以本地创建一个空的develop分支,push到服务器上。 以后这个分支将会包含了项目的全部历史,而master分支将只包含了部分历史。 其它开发者这时应该克隆中央仓库,建好develop分支的跟踪分支: 现在每个开发都有了这些历史分支的本地拷贝。

2、小红和小明开始开发新功能:

这个示例中,小红和小明开始各自的功能开发。他们需要为各自的功能创建相应的分支。新分支不是基于master分支,而是应该基于develop分支,他们用老套路添加提交到各自功能分支上:编辑、暂存、提交。

3、小红完成功能开发

添加了提交后,小红觉得她的功能OK了。如果团队使用Pull Requests,这时候可以发起一个用于合并到develop分支。 否则她可以直接合并到她本地的develop分支后push到中央仓。 在合并功能前确保develop分支是最新的。注意,功能决不应该直接合并到master分支。冲突解决方法和集中式工作流一样。

4、小红开始准备发布

这个时候小明正在实现他的功能,小红开始准备她的第一个项目正式发布。 像功能开发一样,她用一个新的分支来做发布准备。这一步也确定了发布的版本号。

这个分支是清理发布、执行所有测试、更新文档和其它为下个发布做准备操作的地方,像是一个专门用于改善发布的功能分支。 只要小红创建这个分支并push到中央仓库,这个发布就是功能冻结的。任何不在develop分支中的新功能都推到下个发布循环中。

5、小红完成发布

一旦准备好了对外发布,小红合并修改到master分支和develop分支上,删除发布分支。

合并回develop分支很重要,因为在发布分支中已经提交的更新需要在后面的新功能中也要是可用的。

发布分支是作为功能开发(develop分支)和对外发布(master分支)间的缓冲。 只要有合并到master分支,就应该打好Tag以方便跟踪。

Git有提供各种勾子(hook),即仓库有事件发生时触发执行的脚本。 可以配置一个勾子,在你push中央仓库的master分支时,自动构建好对外发布。

6、最终用户发现Bug

对外发布后,小红回去和小明一起做下个发布的新功能开发,直到有最终用户开了一个Ticket抱怨当前版本的一个Bug。 为了处理Bug,小红(或小明)从master分支上拉出了一个维护分支,提交修改以解决问题,然后直接合并回master分支。 就像发布分支,维护分支中新加这些重要修改需要包含到develop分支中,所以小红要执行一个合并操作。 然后就可以安全地删除这个分支了。

6. 扩展思考

SourceTree里GitFlow的使用

1、初始化

SourceTree会自动化进行一些操作,最明显的变化是项目代码库里自动增加了一个develop的分支。

将新创建的develop分支推送到远端仓库。

从此,代码库里就存在了两个永久性的分支:master和develop,未来所有的开发工作都围绕这两个分支进行派生跟合并。

2、之前提到,项目里有两个永久的分支:master和develop。这两个分支也被称为“历史性”分支,在其后的开发工作中, Gitflow模型支持在feature、release、hotfix分支上折腾,这样也有效避免了不同类型的开发工作在代码层级的耦合和干扰。

这三个分支的用途、派生来源分支和合并目标分支如下:

feature,功能开发分支,用于承接具体功能需求的开发

派生于develop

合并于develop

hotfix,bug修复分支,用于解决线上运行环境发现的bug

派生于master

合并于master、develop

release,版本发布分支,用于完成发布准备的

派生于develop

合并于master、develop

跟“历史性”分支相反,这三类分支都是短期分支,针对他们的工作内容完成后,一般都要进行删除。工作内容完成的标识有两个:开发完成、合并完成,缺一不可。

3、我们使用sourcetree来实际演示一下

4、三类临时性分支中,hotfix和release的结果都要合并到master和develop中,为什么?因为它们的修改结果持续影响这后续的开发和维护,必须合并以保证代码的一致性。

如果你没有认识到这个特性很有用,那是因为你的开发工作还没有复杂到一个程度,一个必须要规避代码干扰、保证并行推进的程度。

对于小型项目和团队来说,基于GIT的中心式协作模型和特性分支模型就足够了;GitFlow模型适合中型、大型项目和团队。


 

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

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

相关文章

ANR系列之五:Service类型ANR原理讲解

前言: ANR系列文章一共有有若干篇, 遵循这样的一个顺序: 1.先讲ANR的基本概念以及发生后的流程; 2.四种类型的ANR是如何发生的; 3.该如何排查和解决ANR类型问题。 想看整个系列的文章,可以参考该系列…

在线文档查看器:Gleamtech Document Viewer 6.6.1

DocumentUltimate Document Viewer and Converter for ASP.NET Core, MVC 和 WebForms 查看几乎任何文档类型(70 多种文件格式,包括 PDF 和 Microsoft Office)。 HTML5 零足迹查看器。在文档类型之间转换。 特征 适用于桌面和移动浏览器的通…

【XR】为挑战性环境优化6DoF控制器追踪

Oculus分享:为挑战性环境优化6DoF控制器追踪 尤其是针对具有挑战性的追踪环境 映维网曾在九月和十一月分享了关于Oculus Constellation追踪系统的相关细节,其中负责AR/VR设备输入追踪的Facebook工程经理安德鲁梅利姆(Andrew Melim&#xff…

舆情监测平台都有哪些,舆情监测平台使用工作总结

舆情监测平台(public opinion monitoring platform)是一种用于监测和分析网络上的舆论动态的工具。这些平台通常通过爬取网络上的新闻、博客、论坛、社交媒体等信息来收集数据,并使用自然语言处理技术和数据挖掘技术来分析数据。舆情监测平台常常被用于政府、企业、…

牛客竞赛每日俩题 - Day12

目录 set的插入删除 vector<string>的应用 set的插入删除 数据库连接池__牛客网 [解题思路] 循环接收每组用例&#xff0c;对于每组用例进行如下操作&#xff1a; 1. 依次获取每个状态&#xff0c;如果该状态是"connect"&#xff0c;则将其id插入到set中&…

Adaboost模型的python实现

文章目录介绍Adaboost库参数介绍实例二分类问题多分类问题作者&#xff1a;李雪茸介绍 Adaboost算法是一种集成学习(ensemble learning)方法。在集成学习中&#xff0c;强学习器指的是由多个机器学习模型组合形成的精度更高的模型。而参与组合的模型就被称为是弱学习器。进行预…

数据治理:数据治理之道-数据战略

参考《一本书讲透数据治理》、《数据治理》等 文章目录数据战略定义DAMA对数据战略的定义DCMM对数据战略的定义《一本书讲透数据治理》对数据战略理解数据战略与企业战略、数据架构的关系数据战略的3个要素战略定位短期目标中期目标长期目标实施策略行动计划实施数据战略的5个步…

NFT存储使用NFTUp上传(NFT.Storage)

文章目录NFT存储使用NFTUp上传(NFT.Storage)NFT.StorageNFTUp安装和使用NFT存储使用NFTUp上传(NFT.Storage) NFT.Storage 官网&#xff1a;https://nft.storage/ NFT.Storage&#xff0c;它可以让用户免费使用IPFS与Filecoin存储NFT及元数据内容。 NFT.Storage&#xff0c;…

信息系统业务安全服务资质

信息系统业务安全服务能力评定是指依据《信息化建设企业信息系统业务安全服务能力评定标准》&#xff0c;对信息化建设企业信息系统业务安全服务能力的符合性评价&#xff0c;包括综合条件、财务状况、业绩要求、管理能力、技术实力、人才保障六个方面。通过评定&#xff0c;可…

小黑正在苦于hbase的rowkey的日常积累:md5字符串加密

import hashlib content hello md5hash hashlib.md5(content.encode(utf-8)) md5 md5hash.hexdigest() print(md5)5d41402abc4b2a76b9719d911017c592 参考链接&#xff1a; https://wenku.baidu.com/view/bceba829f22d2af90242a8956bec0975f465a46c?frsogou&wkts167237…

电脑为什么这么卡?6个方法处理电脑卡顿

你是否打开电脑就卡到不行&#xff1f;电脑的开机速度慢&#xff0c;就连打开网页也在转圈圈&#xff0c;一直加载不出来。世界上最痛苦的事莫过于此&#xff0c;想要好好工作&#xff0c;却一直加载不出网页。你知道电脑为什么这么卡吗&#xff1f;其实大多数的原因都在这篇文…

借助 Material Design,帮助您打造更好的无障碍应用 (下篇)

随着时代的发展&#xff0c;"无障碍体验" 对开发者的意义也愈发重大&#xff0c;在上一篇文章中&#xff0c;我们为您介绍了无障碍布局和排版、文案等相关内容。本文将进一步为您介绍图片、声音和运动、实现无障碍的内容。图片图片类型要知道何时以及如何使图片遵循无…

多维尺度MDS案例分析

多维尺度&#xff08;multidimensional scaling, MDS&#xff09;&#xff0c;是一种将研究对象之间距离或者不相似度的直观展示&#xff0c;较为典型的研究对象是地理位置&#xff0c;当然也可以是观点、颜色等任意各类实体或抽象概念&#xff0c;比如茶的口味不相似情况。多维…

MoCo论文:Momentum Contrast for Unsupervised Visual Representation Learning

目录一. 引言二. 背景介绍&#xff1a;对比学习三. 标题和作者四. 动量方式&#xff1a;五. 摘要六. 相关工作七. 结论八. MoCo方法九. MoCo伪代码十. 文章贡献10.1 第一个贡献&#xff1a;如何把一个字典看成队列10.2 文章的第二个贡献&#xff1a;如何使用动量的思想去更新编…

GO-生命周期

好奇心 出于好奇&#xff0c;想了解go的执行生命周期&#xff0c;于是尝试跟着go的源码看看执行过程 go源码地址&#xff1a;GitHub - golang/go: The Go programming language 1.根据命令行编译文件&#xff0c;然后执行二进制文件 &#xff08;1&#xff09;从go运行命令…

基于深度学习的人工林地面激光扫描点云立木特征参数提取方法

Abstract 利用基于三维点云的技术量化立木和立木参数&#xff0c;可以在林业生态效益评估和立木培育和利用中发挥关键作用。随着光探测与测距&#xff08;LiDAR&#xff09;扫描等三维信息获取技术的进步&#xff0c;可以更高效地获取大面积、复杂地形的树木林分信息。然而&am…

IFC常用关系定义

IFC常用关系定义 IfcRelDefinesByType IfcRelDefinesByType表示对象化的关系(The objectified relationship)&#xff0c;定义了一种对象类型定义(object type)和对象实体(object occurrences)的关系。IfcRelDefinesByType是1:n的关系&#xff0c;可以将一个对象类型定义(obj…

深入浅出scala之集合体系(集合即容器)(P46-4)

文章目录一、容器概念二、定长数组一、容器概念 1.集合是一种用来存储各种对象和数据的容器。 2.Scala集合分为可变和不可变的集合&#xff0c;不可变集合可以安全的并发访问。 可变集合可以在适当的地方被更新或扩展。这意味着可以修改&#xff0c;添加&#xff0c;移除一个集…

笔记:软件工程常用开源文档模板 + 软件著作权

https://github.com/AlexanderZhou01/China-software-copyright 下载以上的工程 解压放到U盘里 打开 D:\China-software-copyright-master 国家版权保护中心网址 办理步骤为企业获取政策优惠&#xff0c;减免。为学生提供成果。 办理步骤 (3030)∗50(3030)*50(3030)∗5…

Python 高效率传参调用 MATLAB 程序

Background python调用matlab脚本需要注意前置条件&#xff0c;具体参考官方文档&#xff1a;从 Python 中调用 MATLAB&#xff0c;大致就是两点&#xff1a;一是需要python和matlab版本对应&#xff0c;二是需要matlab运行环境mcr。具体安装配置可以参考&#xff1a;java和pyt…