SourceTree里GitFlow的使用

剪发的Tony 2021-10-29 14:03:32 ⋅ 2008 阅读

这几天看详细了一下Git Flow的模型介绍,感觉“很好很强大”,这个开发模型利用GIT的易于分支和合并的特点,能够比较容易地将开发、发布、部署、bug修复分隔开来。

正准备在自己的团队内部推广使用,比较担心的是管理工作稍微繁琐一点。操作倒不复杂,只是需要头脑清醒,熟悉不同分支间的派生、合并关系和时机。没想到“正在瞌睡的时候送来了一个枕头”,正在使用的SourceTree工具天然支持Git Flow,而且把这个模型的各种操作通过菜单命令的形式提供了出来,大大减轻了使用人员的学习使用成本。

为了能让大家少走弯路,也便于我尽快熟练使用,我进行了摸索和实践,下面把具体的使用方式记录下来供参考。

入口

SourceTree界面顶部的工具栏按钮,从右至左第二个“GIT工作流”图标就是。

初始化

为了便于展示,我在自己的一个Github项目上进行相关的操作。进入这个项目,然后点击刚刚的“GIT工作流”工具栏按钮。

建议不用做任何改动,直接“确定”即可。SourceTree会自动化进行一些操作,最明显的变化是项目代码库里自动增加了一个develop的分支。

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

我们到Github里看这个项目的分支关系图如下:

从此,代码库里就存在了两个永久性的分支:masterdevelop,未来所有的开发工作都围绕这两个分支进行派生跟合并。派生和合并的时机、源分支、目标分支跟具体的开发类型有关,Gitflow里有明确的规则,如果纯粹使用命令行工具的话,需要牢记这些规则并正确执行。而SourceTree则把这些规则用具体功能自动化实现了,这样就能减少人为的失误,至少在我刚开始手动完成这些操作的时候,失误的几率还是挺高的。

从初始化的第一个界面中,还有三类分支的命名规则:feature、release、hotfix,这就是未来承接具体开发工作的分支类型,从名称中就能准确把握他们的用途。

创建分支

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

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

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

  • 派生于develop
  • 合并于develop

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

  • 派生于master
  • 合并于masterdevelop

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

  • 派生于develop
  • 合并于masterdevelop

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

hotfix

正式环境正在运行的项目发现了一个bug,需要创建hotfix分支进行bug修复,在已经做过Gitflow初始化的项目上点击工具栏上的“Gitflow”按钮,出现如下窗口:

但有时候我们已经在库里创建了一个还未完成的分支,就会看到这个窗口:

点击“建立新的修复补丁”:

输入自己想要的分支名称,“确定”即可创建,从预览图中可以看到分支派生来源以及派生出来的分支信息。这里有一点要注意,hotfix分支的名称在最终合并到master时会自动变成标签,而一般来说,master的标签往往标识版本号,比如1.0.0,所以这个分值名称最好能够按照版本规则来命名,比如1.0.1。

hotfix分支创建完成后,在分支目录结构里能够看到它:

经过一系列艰苦卓越的工作,这个bug修复完成了,就要合并到masterdevelop,在SourceTree里,只要通过点击“Gitflow”工具栏即可指导你完成:

点击第一个“完成修复补丁”:

这个操作默认“删除分支”,将把本地的修复分支删除掉,因为它的使命已经完成。合并时如果出现冲突,还是需要开发人员自行解决的。这时能够在“预览”位置看到这个hotfix分支的合并关系示意图。

合并后将代码库推送到远端,这时在Github上可以看到这些分支的关联关系:

中间的蓝色分支既是这个hotfix分支,从图中可以看到这个分支先后被合并到了masterdevelop上。因为我没有把这个分支提交到Github,所以只有图形示意,没有类似masterdevelop的名称指示。

feature

当接到具体的功能需求时,开发人员需要派生feature分支,在SourceTree上,派生的工作相当简单,只要在已经做过Gitflow初始化的项目上点击工具栏上的“Gitflow”按钮,出现如下窗口:

点击第一个按钮“建立新的功能”:

这里,“功能名称”的值不像hotfix分支那样需要考虑发布版本号的规则,可以用能够清晰描述功能特征的文字。

创建完成后,SourceTree的项目目录树就出现了这个新分支,如下:

现在就可以在这个分支上修修补补了,经过一系列艰苦卓越的工作,这个功能开发完成了,就要合并到develop。功能分支只能合并到develop,为新的release分支做准备,

在SourceTree里,只要通过点击“Gitflow”工具栏即可指导你完成:

“删除分支”和“预览”和上面hotfix分支里提到的效果是一样,所不同的是,这里没有“推送变更到远程仓库”的选项。有没有这个选项的差别不大,可能是为了体现分支的推进的紧急程度吧。

合并完成后并将本地库推送到远端Github,这时看Github的分支关系网络图如下:

因为我在做的这个示例操作的时候,并没有再对master分支进行过派生和合并,所以看到master的指示停在原地,后面并入develop的黑色分支既是功能分支。

release

所有特性的开发工作都是为了产品功能的更替,当一个或多个特性开发完成,可以进行发布了,就要准备创建release分支。

Release分支是为上线做准备的,它的命名也要遵守项目的版本命名规则,这个名字在最终合并到master时会自动变成版本标签。

这个release分支也是测试工作的目标对象,,经过一系列艰苦卓越的测试、调整工作,这个release完成了,达到了可上线的状态,就要合并到masterdevelop

如图“预览”所示,这个release的名称会自动成为master的标签。

这一次,我有意没有删除这个分支,并把它推送到了Github,在Github上的分支关系网络图中,能够明确地看到release的起点和终点,它最终被合并到了两个“历史性”分支中了。

收尾

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

至此,SoureTree的Gitflow应用教程已经完成,如果你没有认识到这个特性很有用,我只能说:好吧,你的开发工作还没有复杂到一个程度,一个必须要规避代码干扰、保证并行推进的程度。

对于小型项目和团队来说,基于GIT的中心式协作模型特性分支模型就足够了;本协作模型适合中型、大型项目和团队;对于更大型的团队和项目来说,除了这个协作模型,还有一个交叉型协作模型可供管理使用。


全部评论: 0

    我有话说:

    Gitflow工作流程

    Gitflow工作流程来源于Vincent Driessen网站nvie。 这个工作流程围绕项目发布定义了一个严格模型,它比特性分支工作流程复杂很多,为更大型项目提供了强劲管理框架。 本流程

    聊一聊分布式场景下redis和memcached,及各自经典使用场景和优缺点

    在BAT,redis已经逐渐取代了memcached,成为分布式场景广泛使用缓存方案。接下来,我们就分析下,redis是如何取代memcached,成为开发者宠儿

    代码整洁之道:Lombok 使用

    Lombok项目是一种自动接通你编辑器和构建工具一个Java库。不用再一次写额外getter或者equals方法。

    「轻阅读」为什么在做微服务设计时候需要DDD?

    设计蓝图为什么没有看到DDD影子呢?

    Gitea 1.13.0 发布,流行自托管 Git 服务

    Gitea 1.13.0 已发布,其团队表示在此版本开发周期合并了 649 个 PR。 部分更新亮点: 从 1.13.0 开始,Gitea 最低要求 TLS 1.2 支持 (#12689

    架构实战篇:MyBatis一级、二级,并整合ehcache分布式缓存使用,附演示实例

    ehcache是一个纯Java进程内缓存框架,是一种广泛使用开源Java分布式缓存,具有快速、精干等特点,是Hibernate中默认CacheProvider。

    Spring Cloud 升级之路 - 2020.0.x - 2. 使用 Undertow 作为我们 Web 服务容器

    https://juejin.cn/post/6948036822303768590 在我们项目中,我们没有采用默认 Tomcat 容器,而是使用了 UnderTow 作为我们容器。其实性能上

    架构实战篇(六):Spring Boot RestTemplate使用

    RestTemplate是Spring提供用于访问Rest服务客户端,RestTemplate提供了多种便捷访问远程Http服务方法,能够大大提高客户端编写效率。

    「转载」使用DDD指导业务设计一点思考

    领域驱动设计(DDD) 是 Eric Evans 提出一种软件设计方法和思想,主要解决业务系统设计和建模。DDD 有大量难以理解概念,尤其是翻译原因,某些词汇非常生涩,例如:模型、限界上下文

    微信小程序-ImagewidthFix属性和rpm尺寸使用

    在做微信小程序商品详情页,商品详情是图片集合,渲染完成后发现图片加载很不自然

    跳槽5个误区,冷静一下

    最近看到一篇发布在《哈佛商业评论》上一篇文章,作者是鲍斯·格罗伊斯伯格(Boris Groysberg)

    【开源推荐】基于 Go 语言轻量级高性能日志库 logit使用及测评

    logit 是一个简单易用并且是基于级别控制日志库,可以应用于所有 GoLang 应用程序中。

    移动Web实战篇-使用CSS Sprites减少你页面http请求

    用户新打开一个网页80%时间耗费在加载网页内容方面。很多炫酷网页往往通过图片来展现给用户,那么页面每加载一张图片就是一个http请求,如果图片过多会严重影响图片渲染速度。

    精品推荐:微信平台反编译找回丢失小程序源码

    这篇文章是总结了一下公司后台开发经验,之前他电脑系统突然就坏掉了,电脑小陈需源码也丢失了,怎么找回呢?

    MySql实战篇:正确理解并使用MySql索引

    索引是存储引擎用于快速查找记录一种数据结构,通过合理使用数据库索引可以大大提高系统......

    使用openssl自行颁发SSL证书

    使用openssl 自建ssl证书,轻松开发https服务

    MySql实战篇:写一个简单存储过程,完成订单定时任务

    前言之前我们分享了MySql性能优化、索引详解等内容,本篇文章主要是针对想要入门MySql存储过程读者,主要实现业务是订单库超过30分钟没有支付订单全部置为失效订单......

    使用mybatis-generator自动生成代码(附GitHub下载地址)

    大家都知道Mybatis属于半自动ORM,在使用这个框架中,工作量最大就是书写Mapping映射文件,并且手动书写很容易出错,那么今天来介绍一下使用Mybatis-Generator来帮我们自动