您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

为什么我更喜欢基于主干的开发

时间:2023-09-14 14:00:25  来源:51CTO  作者:

译者 | 刘汪洋

审校 | 重楼

如今,分布式版本控制系统,例如 Git,在版本控制领域已然成为主流。有人认为,使用像 Git 这样的版本控制系统(VCS)进行分支和合并非常便捷。但我更推崇基于主干的开发(TBD),现在我将解释其中的原因。

在基于主干的开发模式中,所有开发人员都在同一个分支(例如 'mAIn')上工作。你可能已经从 Martin Fowler 或 Dave Farley 那里了解过相关讨论。当 Git 迅速成为首选版本控制系统时,通过与 Dave 的合作经历,我亲身体验到了团队在持续交付环境中基于主干开发所带来的优势。

与此不同,分支模型则鼓励开发人员为每个特性、错误修复或增强功能创建独立的分支。虽然分支在隔离变动和降低风险方面看似合理,但许多因素让我更倾向于基于主干的开发方式。

1. 速度与效率

主干开发模式下,整个团队在同一分支上协作,从而实现更迅速的集成,并减少合并冲突。这正是持续集成(CI)的核心理念。虽然现在提到 CI 时通常是指“每次提交时在团队服务器上运行构建和测试”,但CI的本质是确保代码能够定期并顺利地集成。独立分支的代码未集成,且存在时间越长,合并回主代码库的难度越大。独立分支上快速开发的修复和改进似乎很迅速,但最终还是有代价的。定期集成小的更改通常比长时间后进行大型合并更为轻松。

2. 代码稳定性增强

主干开发鼓励频繁提交,从而产生小型、易于管理的更改。频繁拉取其他开发人员的更改,并推送小型、有效的代码更改,有助于确保代码库的稳定性和可用性。如果有 CI 服务器为每次提交运行构建和测试,验证这种“稳定和可工作”的假设就更方便了。任何时候构建中断,我们必须暂停提交,专注于修复。在构建中断时持续推送更改将无益于任何人。

在分支模型下,庞大、不频繁的合并可能会因更改的规模而难以定位和修复错误。当他人合并了大型工作后,你是否曾发现自己的代码不再工作?如果你和他人做了许多不同或重叠的更改,找出导致测试失败或应用程序工作不正常的原因可能会耗费很长时间,而这还需要你有可靠的测试覆盖率。

3. 加强团队协作

结对编程是我最喜欢的团队成员之间的知识共享方式,虽然我知道并不是每个人都能这样做(有关此方面的更多信息,可以查看 JetBrains 的 Code With Me)。如果没有配对,至少团队应该在同一代码上工作。如果每个人都在自己的分支上工作,那么他们其实是在相互竞争而非协作,还可能会因为担心被他人的更改压倒而过于小心翼翼。

若团队都在同一分支上工作,通常会增进对正在进行更改的理解,促进团队协作和知识共享。相反,分支可能造成孤立的工作环境,导致团队内部的知识空白。

4. 持续集成与交付(CI/CD)实践的优化

Dave Farley 的书籍 “持续交付”,以及相关博客文章和视频,都深入强调了“主干开发模式与持续集成和持续交付(CI/CD)实践的天然相容性”。

在主干开发模式下,持续集成的实施更加直接,因为代码会频繁提交到主干分支,而这也正是 CI 环境所构建和测试的分支。任何的失败都能及时发现并解决,从而降低了重大故障的风险。通常,追踪引起问题的具体更改相对容易。如果某个问题无法立即解决,可以回退导致该问题的具体修改。

现在我们应该明白快速反馈循环的价值,因为它能让我们更快地发现问题、找到原因,并迅速修复,从而提升软件的质量。

在主干开发环境中,持续交付也得以蓬勃发展。成功的持续交付要求始终保持代码库可部署的状态。主干开发方法通过促进频繁的提交、集成,以及对所有集成的全面测试,确保了这一目标的实现。任何时候引入的细微修改都使得软件部署和测试更为顺畅。

相较之下,使用分支模型来实现有效的 CI/CD 往往更复杂、更耗时。虽然有人可能会认为:“我可以在我的分支上运行构建和所有测试”,但实际情况是,并非每次提交都进行了真正的集成。直到合并(或变基)的过程中,你才会开始面对任何集成问题。在分支上运行的所有测试,并没有对任何类型的集成进行实际检验。

合并和测试不同分支的代码可能会引入延迟和潜在错误,进而削弱构建流水线的某些优势。

5. 减轻技术债务

长期维护的分支常造成“合并地狱”现象,这是由于主分支(例如 'main')与特性分支之间的差异过大,导致合并过程变得异常困难。这种情况可能引发技术债务的累积,因为解决合并冲突时可能会采用快速但非理想的修复方案,或者接受集成开发环境(IDE)的自动建议而可能对其并未完全理解。相较之下,主干开发、频繁的合并操作和较小的代码更改则使技术债务的管理和减少变得更为便捷。

总结

我个人确信主干开发具备显著优势,并在实际项目中亲自体验了采用此种方法的团队效益。然而,这需要团队共同建立一种思维方式和文化氛围。这其中涉及频繁合并他人的代码更改,经常进行小规模的代码修改,按部就班地进行增量改动。这可能是一种需要适应的开发习惯。整个团队采用一致的方法和文化,关键在于实践配对编程、全面自动化测试和进行适当的代码审查。

有序、纪律的主干开发能简化流程,增强协作,提升代码稳定性,支持CI/CD实践,并减轻技术债务。如果你一直采用基于分支的模型,转变可能会面临挑战,但从长期来看,优势是明显的。若你对此感兴趣,还可以参阅Dave的文章,他在其中解释了主干开发的障碍。

版本控制分支、提交、主干开发、持续集成/部署等是软件开发过程中的关键概念。

译者介绍

刘汪洋,51CTO社区编辑,昵称:明明如月,一个拥有 5 年开发经验的某大厂高级 JAVA 工程师,拥有多个主流技术博客平台博客专家称号。

原文标题:Why I Prefer Trunk-Based Development,作者:Trisha Gee



Tags:开发   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03  Search: 开发  点击:(5)  评论:(0)  加入收藏
哥伦比亚大学华人开发「人脸机器人」,照镜子自主模仿人类表情超逼真
【新智元导读】OpenAI 机器人理解力虽强,却无法进行非语言交流。最近,哥伦比亚大学华人团队打造了全新的机器人 Emo,不仅可以提前预测和模拟人类表情,还可以进行眼神交流。此前,...【详细内容】
2024-04-01  Search: 开发  点击:(17)  评论:(0)  加入收藏
WWDC24苹果开发者大会定档端午节 高管暗示或有AI内容
3月27日,苹果宣布将于6月10日至14日在线举行年度全球开发者大会(WWDC)。开发者与学生们将有机会于大会开幕当天参与在Apple Park举办的线下特别活动。6月10日,大会的第一天也是...【详细内容】
2024-03-27  Search: 开发  点击:(11)  评论:(0)  加入收藏
.Net开发中十种常见的内存错误以及相应的解决方案
在.Net开发中,为内存管理方面提供了许多便利,但仍然存在一些常见的错误和陷阱。这些错误可能导致内存泄漏、性能下降、异常抛出等问题,严重影响应用程序的稳定性和性能。在软件...【详细内容】
2024-03-26  Search: 开发  点击:(12)  评论:(0)  加入收藏
我们一起解锁小程序开发新姿势
如今,鸿蒙开发日益受到广大开发者的关注,而小程序开发也早已成为互联网领域的热门话题。那么,我们不禁要问:是否有可能将这两者融为一体,将小程序开发的便捷与高效带入鸿蒙生态中...【详细内容】
2024-03-20  Search: 开发  点击:(13)  评论:(0)  加入收藏
开发者再分享 OpenAI Sora 生成的短视频:树叶大象、彩虹瀑布等
IT之家 3 月 19 日消息,OpenAI 今年 2 月推出 Sora 模型之后,迅速成为 AI 圈内头条,能够基于用户的一句话,生成最长 1 分钟的视频,效果接近实拍。OpenAI 目前并未向公众发布 Sora...【详细内容】
2024-03-19  Search: 开发  点击:(12)  评论:(0)  加入收藏
宝藏级Go语言开源项目——教你自己动手开发互联网搜索引擎
DIYSearchEngine 是一个能够高速采集海量互联网数据的开源搜索引擎,采用 Go 语言开发。Github 地址:https://github.com/johnlui/DIYSearchEngine运行方法首先,给自己准备一杯...【详细内容】
2024-03-12  Search: 开发  点击:(18)  评论:(0)  加入收藏
生成式AI将在十个方面改变软件开发
上个世纪90年代,当人们提起软件编程时,通常意味着选择一个编辑器,将代码检入CVS或SVN代码库,然后将代码编译成可执行文件。与之对应的Eclipse和Visual Studio等集成开发环境(IDE)...【详细内容】
2024-03-11  Search: 开发  点击:(12)  评论:(0)  加入收藏
2024“跨平台”不香了?知名开源项目淘汰Xamarin,转向原生开发
开源密码管理工具 Bitwarden 开发者在 Reddit 发布消息,称自家应用的 iOS 和 Android 客户端采用微软的跨平台框架 Xamarin 开发,不仅早已过时且消耗资源较多。开发者称,虽然看...【详细内容】
2024-03-07  Search: 开发  点击:(16)  评论:(0)  加入收藏
提供镜像内容,谷歌上线 Chrome for Developers 中国开发者 .cn 域名网站
IT之家 3 月 5 日消息,据谷歌“谷歌开发者”官方公众号,目前用户可以通过 .cn 域名访问 web.dev 和 Chrome for Developers 网站,官方宣称将在相关域名“提供所有镜像后的内容...【详细内容】
2024-03-06  Search: 开发  点击:(17)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条