写点什么

别再推荐 Git Flow 了

  • 2020-03-11
  • 本文字数:1936 字

    阅读完需:约 6 分钟

别再推荐Git Flow了

写在前面

十年前,一篇名为《一个成功的 Git 分支模型》的文章将 Git Flow 推上了风口浪尖。在过去的十年里,无数个开发团队被这篇文章蒙在鼓里。说得严重一点,他们都被骗了。


文章的作者宣称他们已经成功地将 Git Flow 引入到项目中,但对于如何在项目中取得成功的细节却只字未提。


如果我们盲目地相信这篇文章所说的内容,那无疑是一个巨大的错误。我们必须承认,并不是所有的策略都适用于所有的情况、所有的人、所有的环境,而这个道理对于这个分支模型同样适用。


为了更有说服里一点,让我们来更深入地探究一下为什么我们应该让 Git Flow 分支模型葬身火海。

Git Flow 太复杂了

Git Flow 太复杂了,看看下面这张图,它已经很直观地说明了这一点:



这里有功能分支、发布分支、主干、开发分支、紧急修复分支和标签。在构建和发布过程中,你必须跟踪这些东西,还得理解它们,记得它们。


不仅如此,你还需要从头到尾跟踪哪个分支是用来干什么的,这对于你来说是一个很重的认知负担。我已经使用 Git 十年了,我甚至都不确定自己的脑力是否能够承担得了这些东西。

Git Flow 违背了分支的“短命”原则

在使用 Git 时,在同一个分支上开发代码的人越多,出现合并冲突的几率就越高。在使用 Git Flow 后,冲突几率会变得更高,因为还有三个其他的分支(具有不同的生命周期)会合并到开发分支上:功能分支、发布分支和紧急修复分支。现在,出现合并冲突的可能性不是线性的,而是呈三倍的数量增长。


虽然我不愿意说“担心出现合并冲突”是不想采用 Git Flow 分支策略的原因,但当所有这些分支聚集在一起,它们所引入的潜在复杂性是我们无法忽视的。如果你所在的企业提交代码的速度比较慢,或许没什么问题,但对于需要快速开发的企业或初创公司来说,情况就不一样了。

Git Flow 抛弃了 rebase

如果你要使用 Git Flow,就得放弃 rebase。rebase 取消了合并提交——也就是可以看到两个分支合并的地方。由于 Git Flow 的复杂性,你需要可视化跟踪分支,这意味着如果你想要看到来龙去脉,就不能使用 rebase。

Git Flow 阻碍了持续交付

持续交付是指开发团队的每次代码提交都会以自动化的方式(在实际当中是与主干合并)直接发布到生产环境中。看看这一团糟的 Git Flow,你倒是说说如何能够进行持续交付?


Git Flow 分支模型是基于可预测的长期发布周期,而不是基于每隔几分钟或几小时就要发布新代码的场景。这种发布方式的开销太大了。另外,持续交付的一个核心实践是通过修复的方式进行发布,而 Git Flow 将紧急修复作为一个单独的实体,并与其他开发工作分开。

Git Flow 无法应对多代码库

随着微服务的崛起,小型代码库的想法也得到了更多的推动。个体开发团队可以控制他们的代码库和工作流,他们可以控制谁能够向他们的代码库提交代码以及他们的工作流如何工作。


你有没有尝试过使用像 Git Flow 这样的分支模型,并希望每个人都能达成一致?这是不可能的。很快,系统就会出现不同版本的代码库,唯一知道一切的人是使用 YAML 来更新清单的人。你一不小心就很难知道“生产环境中究竟包含了哪些东西”。

Git Flow 无法应对大型单代码库

如果因为版本发布协调困难而无法使用多个微代码库,那为什么不使用一个单独的大型分支工作流,让所有的微服务团队都使用这个工作流?


这种方式在一小段时间内或许是可以的,直到一个开发团队要发布版本而其他团队还没有准备好。如果开发团队是独立的,微服务也是独立部署的,那就不能将你的工作流很好地与这种分支模型结合在一起。

谁应该(或不应该)使用 Git Flow?

如果你所在的公司采用了月度或季度发布周期,并且由一个团队负责并行开发多个项目,那么 Git Flow 可能是一个不错的选择。如果你所在的公司是一个初创公司,或者开发的是一个网站或 Web 应用程序,在一天内可能需要发布多个版本,那么使用 Git Flow 对你来说没有什么好处。如果你的团队规模很小(10 人以下),Git Flow 会给你的带来太多冗繁的工作。


但如果你的团队有 20 多人并行开发多个版本,那么使用 Git Flow 可以确保你们不会把事情搞砸。

如果不使用 Git Flow,那应该用什么?

这个问题我回答不了。并不是所有的分支模型都适用于所有的团队、所有的环境和所有的文化。如果你采用了持续交付,你会想要一些能够尽可能简化交付过程的东西。有些人喜欢基于主干的开发模式,喜欢使用特性标志。然而,从测试的角度来看,这些反而会把我吓一跳。


关键在于你要问你的团队:这种分支模型可以帮助你们解决哪些问题?它会带来哪些问题?这种模式为哪种开发提供更好的支持?你们想要鼓励这种行为吗?你选择的分支模型最终都是为了让人们更容易地进行软件协作开发,因此,分支模型需要考虑到使用者的需求,而不是盲目听信某些人在网上所声称的“成功的分支模型”。

英文原文

Please Stop Recommending Git Flow


2020-03-11 14:2115223
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 402.7 次阅读, 收获喜欢 1986 次。

关注

评论 7 条评论

发布
用户头像
毫无意义+1
2023-09-18 09:50 · 江西
回复
用户头像
GP不通. 吃饭还会噎死呢. 干脆不吃饭吧
2020-11-05 14:27
回复
用户头像
如果你只是单纯反对一个东西而不提出替代方案,那你的反对毫无意义
2020-10-13 15:44
回复
用户头像
什么GP文章……
2020-03-25 13:59
回复
用户头像
gitflow 显然不是适合每一个场景的,然而现有的工作流程gitflow也是无可替代的
2020-03-23 09:57
回复
用户头像
这作者既然脑力有限,无法理解 gitflow,就何必还要基于自己错误的理解来进行批判…
2020-03-16 09:58
回复
用户头像
如果没有更好的标准,那就按照 Git Flow 来。文章作者的意思绝对不是要对 Git Flow 生搬硬套,应用到实际项目中可以修改。
2020-03-15 15:04
回复
没有更多了
  • 当“代码农”遇上“码农”:揭秘主干开发的那些事儿 | 京东云技术团队

    前段时期我负责部门内部主干开发落地相关事宜,这个过程中,也真真切切的体会到了多人开发过程中,面对特性分支管理中,大家遇到的一些困扰,尤其面对敏捷迭代的开发方式,合并冲突,集成测试,代码重用等方面,都与高效两个字背离。当然,我在推进主干开发过

    2023-06-07

  • 以终为始,依托度量指标,多种工具全面提升研发效能

    高效能是企业取得成功的关键要素之一,通过提升团队的效能,可以实现更高质量的工作成果、更快速的产品交付和更好的客户满意度。然而,在追求效能提升的过程中常常面临很多痛点。

    2023-11-15

  • 20 个 Git 命令玩转版本控制

    想要在团队中处理代码时有效协作并跟踪更改,版本控制发挥着至关重要的作用。Git 是一个版本控制系统,可以帮助开发人员跟踪修订、识别文件版本,并在必要的时候恢复旧版本。Git 对于有一定编程经验的用户来说虽然不算太难,但是想要玩转一些高级功能也并不是

    2023-02-13

  • 什么是分支模式 ? 各 (类) 分支正确的使用方式

    什么是分支模式 ? 本节内容详细介绍分支模式下,各(类)分支的使用方式。在使用分支模式过程中用户可以只需要关心集成和发布哪些 feature 分支,而对 release 分支创建和管理、分支合并等一系列工作,可以托付给云效 Flow来 完成。能够很好的节省我们的时间,

    2022-03-28

  • 如何通过云效 Codeup 高效落地分支模式,提升开发协作率

    分支模式是我们在进行代码变更时的一种约定,它在版本管理工具(如Git)之上,约定我们在不同分支上的行为,达到提升开发协作效率的目的。云效Codeup 是一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、质量检测等功能,全方位保护企业代码资产,

    2022-04-14

  • 技术干货 | ToB 业务场景下自动化测试的实践及探索

    ​在 ToB 业务快速迭代与新版本发布过程中,开发和 QA 提测面临着大量人工测试场景,本文就 ToB 业务场景下面临的测试难题,结合网易云信自动化测试的实践进行了探索。

    2022-01-11

  • 团队如何选择合适的 Git 分支策略?

    现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等。

    2023-07-11

  • Git 分支教程:详解分支创建、合并、删除等操作

    Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效。分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作。本篇博客将详解Git分支的创建、合并、删除等操作,帮助你更好地理解和使用Git的分支功能

    2023-06-01

  • 云环境中的持续集成:CI/CD 的工作流程

    2021-01-07

  • 移除 Staging 环境,加快部署过程

    Squeaky是一家在不侵犯用户隐私的情况下帮助企业了解用户如何访问他们的网站或Web应用程序的公司,它采用了不一样的做法,并解释了为什么他们不使用Staging环境。他们相信这有助于他们更快地发布产品,并减少生产环境中的Bug。

  • AIGC 背后的技术分析 | 知识图谱

    简介: 知识图谱是知识工程的一个分支,以知识工程中语义网络作为理论基础,并且结合了机器学习、自然语言处理以及知识表示和推理的最新成果,在大数据的推动下受到了业界和学术界的广泛关注。知识图谱对于解决大数据中文本分析和图像理解问题发挥了重要作用

    2023-05-16

  • 多分支集成发布各种坑怎么填?

    小明的研发团队要发布一个版本,这个版本包含了多个功能特性,每个不同的特性之间有较强的独立性。不同的特性由不同的开发人员或开发小组分工完成。

    2022-04-29

  • Git 进阶(三):webstorm 的 git 切换分支

    项目根目录 -> Git -> Repository -> Brabches

    2021-12-02

  • 云效 Flow 如何实现阿里云 ECS 多环境发布

    在软件开发和部署过程中,我们的软件需要在不同的运行环境中运行,例如:开发人员本地开发环境、测试团队的测试环境、还有类生产环境和生产环境。在整个研发流程的过程中如何通过云效流水线有效拉通开发与运维,打破二者之间的壁垒墙,让开发与运维高效联动。

    2022-02-15

  • 研发流程设计(下):如何管理应用的生命周期?

    今天,我从技术演进的维度介绍了应用生命周期管理技术,这些技术可以提高应用的研发效率和质量。

    2021-06-12

  • 持续集成:你说的 CI 和我说的 CI 是一回事吗?

    今天,我们来聊一聊CI落地建设的三个阶段和其中的核心理念,即快速集成、质量内建和文化建立。

    2019-11-07

  • Git 代码分支管理 | 京东云技术团队

    不少团队内的新同学对 git 分支的命名和管理方式有些许的模糊,分支的命名规范以及管理方式对项目的版本发布至关重要,为了解决实际开发过程中版本发布时代码管理混乱、冲突等比较头疼的问题,我们将在文中阐述如何更好的管理代码分支。

    2023-05-17

  • 分支策略:让研发高效协作的关键要素

    分支策略就是研发协作和发布模式的风向标,找到适合当前团队的分支策略,是非常重要的事情。

    2019-11-05

  • 工作流设计:如何设计合理的多人开发模式?

    今天我们来聊聊如何设计合理的开发模式,我会为你介绍4种受欢迎的工作流,你可以选择其中一种作为你的工作流设计。

    2021-06-08

  • 平台产品研发:三个月完成千人规模的产品要怎么做?

    关于如何开发产品,在这一讲中,我会把我自己在过去几个项目经历中的经验总结全部分享给你。

    2019-12-17

发现更多内容

Python3 Note 如何合理使用assert

awen

Python assert

5.29 相约杭州!云原生 Meetup 第二期杭州站报名开启!

青云技术社区

云原生

helm-kubernetes的包管理器

片风

云原生 Helm 包管理工具

用Terraform申请Letsencrypt证书

大可不加冰

云计算 证书 IaC Terraform HashiCorp

安全专栏加餐

escray

学习 极客时间 安全 5月日更 安全攻防技能30讲

这可能是中文互联网第一本系统性讲解Terraform的入门教程

大可不加冰

云计算 IaC Terraform HashiCorp 不可变基础设施

如何通过别名扩展Git

kenny

bash git git扩展

原来,GitHub标星90K+的Leetcode刷题手册长这样

Java架构师迁哥

5分钟速读之Rust权威指南(十)

wzx

rust

用 Java 实现坦克大战,这个有点强了!

Java架构师迁哥

人生算法:重新启动的精神装置

石云升

读书笔记 思维模型 5月日更

网络攻防学习笔记 Day26

穿过生命散发芬芳

5月日更 网络攻防

FIL矿池挖矿算力分发系统开发搭建

薇電13242772558

数字货币 算力

AI医疗发展中的机遇与有效监管

CECBC

达利欧:我持有一些比特币,美元重回1971年,现金就是垃圾

CECBC

Terraform中使用prevent_destroy搭配override文件防止误删资源

大可不加冰

云计算 基础设施即代码 IaC Terraform HashiCorp

另一种总结的方式

Nydia

学习

Python3 Note 浮点类型误差问题

awen

Python 浮点型 decimal

极狐GitLab 13.11功能回顾,含Kubernetes Agent和流水线合规性

极狐GitLab

系统运维 安全监控审计 #on-call #GitLab 极狐GitLabs

亚马逊云开发者 Meetup 又双叒叕来了,您报名了吗?

亚马逊云科技 (Amazon Web Services)

开源数据库

吾日三省 - DAY 16

Qien Z.

5月日更 半年总结

Dubbo 序列化

青年IT男

dubbo

Flink的流数据SQL

五分钟学大数据

flink 5月日更

5G加油站,需要中频段

脑极体

Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

Linux服务器开发

redis 后端 多线程 Linux服务器开发 网络io

数字人民币与区块链的区别与联系

CECBC

面向WEB开发的Docker(四):启动MySQL数据库

devpoint

Docker

出于信仰,我去考了一个证

大可不加冰

云计算 IaC Terraform HashiCorp

如何入门数据分析?

数据社

大数据 数据分析 5月日更

中台反思:云原生下API网关的选择

孤岛旭日

网关 api 网关 平台 技术中台

悟透前端:加深Javascript变量函数声明提升理解

devpoint

变量声明

别再推荐Git Flow了_文化 & 方法_George Stocker_InfoQ精选文章