持续交付 36 讲
王潇俊
携程系统研发部总监
39681 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
开篇词 (1讲)
结束语 (1讲)
持续交付 36 讲
15
15
1.0x
00:00/00:00
登录|注册

04 | 一切的源头,代码分支策略的选择

多数互联网大公司采用特性分支开发策略
GitLab作为最优秀的开源代码平台
选择适合的分支策略
有三个子类模型
适用于不同发布场景
适用于GitHub代码平台
简单实用
hotfix和release分支多余
烦琐流程
对团队个人开发能力要求高
冲突少
高集成效率
国内互联网公司的选择
项目情况
GitLab Flow
GitHub Flow
Git Flow
缺点
优点
如果团队只有5人,迭代周期为1周,采用什么样的分支策略?
开源性质的项目,为什么不适合用主干开发的分支策略?
不同情况适用的代码分支策略
特性分支开发
主干开发(TBD)
思考题
选出最适合的分支策略
选择适合的代码分支策略
代码分支策略

该思维导图由 AI 生成,仅供参考

记得大概是一年前吧,我与好友老吴喝茶聊天时,讨论到:高效的持续交付体系,必定需要一个合适的代码分支策略。
我告诉老吴:“采用不同的代码分支策略,意味着实施不同的代码集成与上线流程,这会影响整个研发团队每日的协作方式,因此研发团队通常会很认真地选择自己的策略。
老吴是一名有多年开发经验的资深架构师,当时正好要接手一个框架团队,从个人贡献者向团队管理者转型。他个人对代码管理工具可谓熟之又熟,甚至连“老古董”的 CVS 都可以跟你聊半天。但他在为团队制定代码分支管理策略时,还是慎之又慎,足见其重要性。
最后我们发现,要确定选用哪种代码分支管理策略,需要先假设几个问题,这几个问题有了答案,也就代表你找到了适合的方向。
你需要思考的几个问题如下:
Google 和 Facebook 这两个互联网大咖都在用主干开发(Trunk Based Development,简称 TBD),我们是不是也参照它俩,采用主干开发分支策略?
用 Google 搜索一下,会发现有个排名很靠前的分支策略,叫“A successful Git branching model”(简称 Git Flow),它真的好用吗?团队可以直接套用吗?
GitHub 和 GitLab 这两个当下最流行的代码管理平台,各自推出了 GitHub Flow 和 GitLab Flow,它们有什么区别?适合我使用吗?
像阿里、携程和美团点评这样国内知名的互联网公司,都在用什么样的分支策略?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

选择适合的代码分支策略对于持续交付体系至关重要。本文从主干开发和特性分支开发两个角度出发,分析了不同的代码分支策略模型,包括Git Flow、GitHub Flow和GitLab Flow。主干开发适用于高要求的持续交付,但对开发团队的能力要求较高。特性分支开发提供了更多的灵活性和简化的流程,适用于不同的发布场景。文章还总结了不同情况下应选择何种分支策略,并介绍了国内知名互联网公司的代码分支策略选择和定制实践。读者可以全面了解代码分支策略的优缺点和适用情况,帮助他们做出合适的选择。文章还介绍了各种代码分支策略的特性,包括“主干开发”和“特性分支开发”两种策略的各自特性。相信在绝大多数的场景,企业会选择“特性分支开发”的策略。给出了几种主流的特性分支方法,并对比了各类策略的优劣,以及它们适用的场景。读者可以根据自己所在项目的具体情况,参考今天的内容,裁剪出最适合自己团队的分支策略。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《持续交付 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(38)

  • 最新
  • 精选
  • 康美之心 淇水之情
    微服务架构下,比较适合主干开发,一个微服务(含1-4个API)根据复杂性和规模通常由1-3的开发进行开发(含单元测试的开发),1位测试进行API自动化测试开发,单元测试和API测试都集成到Pipeline上,一旦变动代码提交到master上后,就自动启动Pipeline上的build,在build这里会自动完成覆盖率100%的单元测试,单元测试通过,自动触发FVT deployment,部署成功后,自动触发FVT API自动化测试,FVT测试通过后;自动打出上线的tag号,并把这个tag号的部署到UAT,UAT部署成功后,自动触发UAT的API自动化测试,测试通过后,这个UAT的tag的就可以部署上线了。

    作者回复: 讲的好,主干开发除了cherry pick以外,都简单直接

    2018-07-14
    2
    30
  • 禾子先生
    对于第二个问题,我的思考是使用github flow,虽然追求效率,但必须保证线上版本是一个稳定。大家都在开发分支中进行开发,快速测试和迭代,合并到master时冲突也少。也考虑过使用主干开发,不过但从稳定角度来说,还是选择了前者

    作者回复: 很棒

    2018-07-13
    8
  • bullboying
    在自动化测试还没怎么做到位的情况下,为了控制合并到master的都是经过测试的代码,我们增加了一个SIT分支。每次有新特性需要开发时,从master分支check out一个特性分支进行开发,可能涉及到多人协同开发。自测完成后先发起merge request到SIT分支,如果有冲突则不允许merge,以实现不同特性分支间的隔离。如果没冲突且有集成测试人员空闲,则完成merge并安排测试,测试通过后由masters再发起merge request将特性分支合并到master。因为之前控制了冲突,所以第二次合并理论上是没有冲突的。现在纠结的几个问题,一是想要限制不能从SIT分支pull,否则就达不到多个特性分支隔离的效果,全靠开发人员自觉;二是因为隔离冲突是为了限制在制品,但导致master和SIT分支上的代码其实是不同的,是否需要测试两次?

    作者回复: 您提到利用SIT分支来保证合并到master的都是经过测试,我们强烈建议使用 SmartMerge(本专栏第7讲) 来代替SIT,可以更及时地发现代码集成冲突的问题,其次可以更便捷地决策出用于上线的最大集合。 提到的第一个困惑,我们采用SmartMerge后,对应会有SmartMerge的分支,第一个问题演变为“怎么限制开发不要从SmartMerge的分支创建新分支,而只能从master分支创建新分支?”我认为这个演变过来的问题非常好。可以从两个方面着手来规范。 1)如果在gitlab UI上创建分支的话,我们可以很容易地限制只能从master创建新分支。 2)另一方面我们不打算限制git客户端的行为,仅当git客户端向gitlab服务端push新分支的时候做相应的检查。为了判断新分支是否从master拉取且尚未和其他分支做merge,只需查看该分支和master的merge-base的commit之间,是否存在merge的commit即可,如果有,则不允许push。 如果没有采用SmartMerge的方式,其实方法本质是相同的。如果短期内还是只能通过SIT分支的话,做法和SmartMerge的方式是一样的。 口诀为:在服务端直接控制新分支的创建,且拒绝客户端push不规范的新分支。 第二个困惑,假设你们尚未使用SmartMerge的方式,可以通过在你们的开发流程中额外增加一个活动来搞定。用于集成的SIT分支在编译打包前,务必和master做merge,打包测试后如果没问题的话,SIT和master分支做fast forward的检查,如果是fast forward,那么SIT merge到master分支产生的commit,内容和SIT 的HEAD是相同的,也就无需再一次进行测试了。如果你们master分支的变更只能来自SIT分支,那么这个fast forward是很容易得到保证的。

    2018-07-18
    2
    4
  • 徐卫
    你好,问下。老师帮我看下理解对不对。主干开发是否只有一个分支,开发的代码提交到这个分支,发布也是用此分支。文中讲到的特性切换怎么做的? 我个人理解是在那个发布的版本上打标签,特性切换是从tag上拉出一份代码部署?

    作者回复: 主干开发也可以有多个分支,除了master,其他是发布分支,master是用来持续集成的,也就是大家只往master push代码 特性切换不是分支,是代码或框架实现的功能,就理解为功能开关好了,也就是说有些代码即使上线了,也能通过开关保证它不工作

    2018-07-12
    3
  • 董永刚
    分支类型中,带生产分支,带发布分支,带产品分支的分别是什么样的场景呢?

    作者回复: gitlab几个flow,除了用于集成的master分支外,额外还配置了其他用于测试或上生产的分支。 拿带生产的分支来说,如果公司约定每周四才能发布到生产,而团队于周二在master上就集成好了V3.6版本,为了不影响后面的集成,master分支需要先merge到PRODUCTION分支,周四上线只需取PRODUCTION分支即可。 当然,gitlab flow也只是提供一个解决方案而已,只要能在发布窗口时正确快捷地找到用于发布的commit,同时又不影响集成即可。 至于提供带环境分支的,就是用分支模型来规约发布流程,保证用于上线的代码经过层层测试。做法就是约好了只能用PRODUCTION分支上线。比如通过PRE-PRODUCTION环境测试后,才能把该环境对应的分支合入到PRODUCTION分支。

    2018-07-17
    2
    2
  • 纳米
    您好 我是一个非开发的人员。弱弱问下,最后表里总结的生产分支 环境分支中,开发人员自身是check out哪个分支代码出来开发 又是往哪个分支集成呢。能否在这两个分支上帮细化下。非常感谢。 思考题2 我理解 既然人很少 迭代周期也较为宽松 可能这一周大部分人都工作在一个功能或者版本上 是不主干开发反而也可以。github flow应该肯定是ok的。

    作者回复: 特性分支模式下,都是从production拉取的开发分支,然后合并到master,master做持续集成,为了不影响持续集成,所以有了从master拉出来的环境分支进行部署 要考虑团队人员的能力,如果新人较多,就使用特性分支,反之使用主干开发,github flow的pull request其实也是特性分支

    2018-07-12
    2
    2
  • 白天不懂爷的黑
    老师,您好,最近公司想用gitlab做配置中心,请问贵公司gitlab的高可用是怎么做的呢?谢谢

    作者回复: 最新版本应该给了和GitHub类似的解决方案,我们是对gitlab做了分片,每个分片是一个仓库,在集群之前增加了基于nodejs ssh2修改的proxy,仓库做简单的定时备份

    2018-07-12
    2
  • smartzs
    老师,主干开发 和 带发布分支模型 很像啊,带发布分支约等于主干开发了吧?

    作者回复: 还是有一点区别的,比如可以暂时预设多个发布分支,以针对一段时间内的多版本并行需要

    2018-12-11
    1
  • 小胖胖
    gogs被gitlab 应该选择哪个?有什么区别吗

    作者回复: 主要还是看你能hold住哪个,比如我个人属于rubyist,所以用ruby写的gitlab肯定就是我的首选了,如果你比较偏爱或擅长go,那就gogs了。 相对来说我个人觉得gogs比较轻量化,有好处有坏处,比如你要大量二次开发,gitlab service形式就比较友好,而且最近也开源了HA方案

    2018-07-13
    1
  • 初七之月亮
    带环境发布分支方法的多数适用场景是啥呢?是不是有多少套环境就多少套分支啊?

    作者回复: 比如有些环境是独立与其他服务联调用的,为了保证master的持续集成,而又不至于污染这个联调环境,就需要一个独立分支了

    2018-07-12
    1
收起评论
显示
设置
留言
38
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部