首页 > 其他分享 >Gitflow工作流--最佳实践

Gitflow工作流--最佳实践

时间:2023-06-13 15:24:19浏览次数:46  
标签:功能 git develop -- Gitflow 最佳 发布 master 分支

Gitflow工作流

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

Git Workflows: Gitflow Cycle

这节介绍的Gitflow工作流借鉴自在nvie的Vincent Driessen

Gitflow工作流定义了一个围绕项目发布的严格分支模型。虽然比功能分支工作流复杂几分,但提供了用于一个健壮的用于管理大型项目的框架。

Gitflow工作流没有用超出功能分支工作流的概念和命令,而是为不同的分支分配一个明确的角色,并定义分支之间如何和什么时候进行交互。 除了使用功能分支,在做准备、维护和记录发布时,也定义了各自的分支。 当然你可以用上功能分支工作流所有的好处:Pull Requests、隔离实验性开发和更高效的协作。

1 工作方式

Gitflow工作流仍然用中央仓库作为所有开发者的交互中心。和其它的工作流一样,开发者在本地工作并push分支到要中央仓库中。

2 历史分支

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

img

剩下要说明的问题围绕着这2个分支的区别展开。

3 功能分支

每个新功能位于一个自己的分支,这样可以push到中央仓库以备份和协作。 但功能分支不是从master分支上拉出新分支,而是使用develop分支作为父分支。当新功能完成时,合并回develop分支。 新功能提交应该从不直接与master分支交互。

img

注意,从各种含义和目的上来看,功能分支加上develop分支就是功能分支工作流的用法。但Gitflow工作流没有在这里止步。

4 发布分支

img

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

使用一个用于发布准备的专门分支,使得一个团队可以在完善当前的发布版本的同时,另一个团队可以继续开发下个版本的功能。 这也打造定义良好的开发阶段(比如,可以很轻松地说,『这周我们要做准备发布版本4.0』,并且在仓库的目录结构中可以实际看到)。

常用的分支约定:

用于新建发布分支的分支: develop
用于合并的分支: master
分支命名: release-* 或 release/*

5 维护分支

img

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

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

6 示例

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

创建开发分支

img

第一步为master分支配套一个develop分支。简单来做可以本地创建一个空的develop分支,push到服务器上:

git branch develop
git push -u origin develop

以后这个分支将会包含了项目的全部历史,而master分支将只包含了部分历史。其它开发者这时应该克隆中央仓库,建好develop分支的跟踪分支:

git clone ssh://user@host/path/to/repo.git
git checkout -b develop origin/develop

现在每个开发都有了这些历史分支的本地拷贝。

小红和小明开始开发新功能

img

这个示例中,小红和小明开始各自的功能开发。他们需要为各自的功能创建相应的分支。新分支不是基于master分支,而是应该基于develop分支:

git checkout -b some-feature develop

他们用老套路添加提交到各自功能分支上:编辑、暂存、提交:

git status
git add <some-file>
git commit

小红完成功能开发

img

添加了提交后,小红觉得她的功能OK了。如果团队使用Pull Requests,这时候可以发起一个用于合并到develop分支。 否则她可以直接合并到她本地的develop分支后push到中央仓库:

git pull origin develop
git checkout develop
git merge some-feature
git push
git branch -d some-feature

第一条命令在合并功能前确保develop分支是最新的。注意,功能决不应该直接合并到master分支。 冲突解决方法和集中式工作流一样。

小红开始准备发布

img

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

git checkout -b release-0.1 develop

这个分支是清理发布、执行所有测试、更新文档和其它为下个发布做准备操作的地方,像是一个专门用于改善发布的功能分支。

只要小红创建这个分支并push到中央仓库,这个发布就是功能冻结的。任何不在develop分支中的新功能都推到下个发布循环中。

小红完成发布

img

一旦准备好了对外发布,小红合并修改到master分支和develop分支上,删除发布分支。合并回develop分支很重要,因为在发布分支中已经提交的更新需要在后面的新功能中也要是可用的。 另外,如果小红的团队要求Code Review,这是一个发起Pull Request的理想时机。

git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1

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

git tag -a 0.1 -m "Initial public release" master
git push --tags

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

最终用户发现Bug

img

对外版本发布后,小红小明一起开发下一版本的新功能,直到有最终用户开了一个Ticket抱怨当前版本的一个Bug。 为了处理Bug,小红(或小明)从master分支上拉出了一个维护分支,提交修改以解决问题,然后直接合并回master分支:

git checkout -b issue-#001 master
# Fix the bug
git checkout master
git merge issue-#001
git push

就像发布分支,维护分支中新加这些重要修改需要包含到develop分支中,所以小红要执行一个合并操作。然后就可以安全地删除这个分支了:

git checkout develop
git merge issue-#001
git push
git branch -d issue-#001

标签:功能,git,develop,--,Gitflow,最佳,发布,master,分支
From: https://www.cnblogs.com/starkzz/p/17477586.html

相关文章

  • 84 局部变量 在get set等方法中 ;成员变量在属性中
    packagecom.fqs.demo061302;publicclassGirl{//属性//成员变量Stringname;privateintage;publicvoidsetAge(intage){//【局部变量】名称可以和上面的【成员变量】一样//赋值if(age<50&&age>18){this......
  • Sql 存储过程
    定义: StoredProcedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的......
  • (转)我所理解的Entitas——入门(一)
    关于ECS框架ECS框架被大家所熟知是源于2017年GDC大会上《守望先锋》针对他们关于ECS架构的做了一次技术分享,在此之前ECS框架只是并未被广泛使用和流传。和传统的OOP框架以类为基础将数据和逻辑放在类中处理的方式不同,ECS是以功能为基础,遵循组合优于继承的原则将功能分开处理。这样......
  • AGC043
    AGC043A.RangeFlipFindRoute简单DPB.123Triangle推性质。利用模运算将减法变成加法(在绝对值0/1的情况下)。GiantGraph类似于博弈论的东西。首先考虑\(n^2\)建图的做法,在考虑不建图,利用虚建边的形式做。参考:题解AT5800【[AGC043C]GiantGraph】-Kewth的洛谷博......
  • 【Python&RS】基于GDAL哨兵二号波段合成
    ​        学遥感的避免不了使用哨兵数据,毕竟10m的分辨率可以满足大部分的定量分析,同时也是最重要的一点,它免费!!!     之前好像ENVI5.3打不开哨兵数据,易智瑞已给出了解决办法。我想说的是大家能下载L2A级数据就去下,省的麻烦。如果需要的数据只有L1C级,那就使用......
  • AGC033
    AGC033听讲着感觉没有做的那套AGC055难。主要是套路比较多。A.DarkerandDarker简单的BFS即可。B.LRUDGame有两种做法:逆着考虑,还原可赢的初始区间。对于先手,当前如果有一个向上走的,那么纵向上界便会被抬高。其他方向类似。对于后手,与先手相反,会使得范围变小,但......
  • Postcat X APISIX 合作插件 :一键同步,轻松配置到 APISIX
    近日,云流科技(广州)有限公司(简称“Eolink”)旗下的开源API管理工具Postcat和深圳支流科技有限公司(简称“API7支流科技”)在各自擅长的领域携手合作,推出了Postcat&ApacheAPISIX插件,用户只需要安装此插件,即可轻松地将Postcat产品中管理的API相关配置的数据同步到开源网关......
  • vue中watch监听
    1.对data中一般数据的监听,使用watch,回调有newValue和oldValue两个参数,当数据变化后触发watch:{/***data中数据的监听*@paramnewValue*@paramoldValue*/value:function(newValue,oldValue){alert('监听'+oldValue+'变为'+ne......
  • BLE中的设备地址
    简介设备地址,也叫MAC地址。在BLE中对设备地址分了很多类别,但实际使用的MAC地址只有有四种:PublicDeviceAddress:公共设备地址StaticDeviceAddress:静态设备地址Non-resolvablePrivateAddress:不可解析私有地址ResolvablePrivateAddress:可解析私有地址PublicDevice......
  • uniapp开发公众号H5时用户缓存无法清除问题
     业务场景:  此项目是一个vx公众号h5项目,每次更新版的时候用户端由于有缓存,每次都是使用滞后的版本解决方案:一、index.html文件如何保证不缓存,每次都使用服务器上最新的代码?此时需要一下标签:<metahttp-equiv="Cache-Control"content="no-cache,no-store,must-revali......