07 | 分支管理:Facebook的策略,适合我的团队吗?
07 | 分支管理:Facebook的策略,适合我的团队吗?
讲述:葛俊
时长20:27大小18.73M
Facebook 的分支管理和发布策略
开发分支
发布分支
Facebook 分支管理策略的背后原因
其他主要分支方式
Git-flow 工作流
Fork-merge
灵活的功能分支组合成发布分支
哪一种分支管理策略更适合我的团队呢?
小结
思考题
赞 3
提建议
精选留言(24)
- 技术修行者2019-09-13看完这篇后,最大的感受就是Git是个宝库,之前对它的使用还停留在表面,我要去找本书系统学习一下。
作者回复: Git的却很强大,很方便。确实也需要投入时间学习。我2010年初始Git的时候,找一个Git老手讨教,他非常热心地给我讲了一个半小时,我还是迷迷糊糊。不过现在想起来还是很感激他 :) 这个链接是一个有趣的图形化Git学习工具。你可以看看:http://git-school.github.io/visualizing-git/#cherry-pick
共 2 条评论14 - 旭东(Frank)2019-09-12想问一下老师,Facebook的开关是配置系统统一管理的吧?那么多功能分支,都靠开关管理,如何做好多个配置开关有效快速管理?
作者回复: 是统一管理的。这个系统叫GateKeeper。推荐你看看这个,有很多细节:https://www.quora.com/How-does-Facebooks-Gatekeeper-service-work
共 3 条评论7 - phobal2019-09-07像 Facebook 这种主干(master)开发模式,每个人的代码每天都会合入到 master,实际中经常会有这样的情况:A、B 两个 feature 同时在进行,但上线时间不同,A 先上,那基于这种模式,A 上的话就会带入 B 的代码,难道 A 上的时候再基于上一个稳定版本 tag 再 cheery-pick A 的所有功能代码到测试分支?
作者回复: 如果B的功能还没有准备好给用户使用,可以使用功能开关隐藏。
6 - Johnson2019-09-06听起来trunk-base这种方式基本和集中式的svn和perforce是一个思路,那疑问就是为啥不直接用perforce,收费?学习成本?需要额外的运维投入? trunk-base针对pull request的方式还有一个疑问,怎么做pre checkin的code review来控制入库代码的质量? 我能想到的好像还是集中式的那种checkin必须使用固定的工具,这个工具会去自动获取这个提交的code review,如果没有就不允许checkin.展开
作者回复: > 听起来trunk-base这种方式基本和集中式的svn和perforce是一个思路,那疑问就是为啥不直接用perforce,收费?学习成本?需要额外的运维投入? 非常好的问题。我觉得至少有以下几个好处: 1. 分布式的好处,使得开发人员在本地操作速度快。 2. 分布式的另一个好处。虽然我在文章中没有写,使用的频率也不是很高,但是开发人员的个人repo是可以互相推送代码进行合作的,不经过统一的中央repo。 3. Git开源。事实上,2015年左右,Facebook每天有太多的commits,所以Git的性能逐渐不能满足。于是Facebook尝试修改Git的代码。不过因为Git社区觉得Git代码仓不应该超级大,所以没有合作成功。最终Facebook从Git转向了Mercurial(hg)。ht是另一个类似Git的分布式代码仓管理系统。hg也是开源,Facebook通过提高hg解决的commits太多的问题。这就是使用开源的好处。这里强调一下,虽然Facebook从Git转到了hg,但是今天文章中讨论的分支策略对hg也是有效的。 4. Git免费 5. 在进行周部署,日部署、热修复部署中各种分支处理,Git的比svn,perforce强大。这一点因为我对Perfoce不是特别熟悉,不是100%确定。 > trunk-base针对pull request的方式还有一个疑问,怎么做pre checkin的code review来控制入库代码的质量? 我能想到的好像还是集中式的那种checkin必须使用固定的工具,这个工具会去自动获取这个提交的code review,如果没有就不允许checkin. 这个的确是一种方式。比如使用Phabricator进行Code Review的时候,Phabricator对外提供接口。在开发者尝试push代码到Git Server的时候,Git Server可以会去Phabricator检查用户的commit有没有通过Code Review。 另外一个方式是让代码审查工具,比如Phabricator,Gerrit,在Code Review通过之后,代替开发者Push commit。
共 4 条评论5 - 菜头2019-12-27facebook 的原子化提交这块,开发是以什么标准拆分,确保原子性的。老师能否帮忙介绍下。谢谢
作者回复: 几个标准: 1. 提交不要超过一个功能。如果是bug fix的话可以有几个类似的fix放到一起(因为提交太小也不好)。 2. 如果功能较大,提交应该是一个功能的子功能 3. 这个提交需要能够入master库后不会break master。也就是说,该提交在入master之后,上可以从这个提交的位置发布一个产品。当然可能会有Bug,但是不能出现功能不能用的情况。要么功能实现完成,要么用户看不到。 另外大小上来说,并没有严格规定多少文件多少行。但是要让代码审查者审查起来不能太困难。
3 - 技术修行者2019-09-13全栈是趋势,这是不可避免的。 全栈不意味着所有事情都亲力亲为,从个人发展的角度来说,肯定还是需要先在某个方向上做专做精,然后对项目涉及的其他方面由浅入深的逐渐熟悉。在读圣贤书的同时,也要知窗外事。
作者回复: 👍👍👍
3 - GeekJ2020-02-02从上面文章中获取,您的cherry-pick 策略都是在master上进行修复,然后cherry-pick 至周部署分支或热修复分支。 针对这个场景,我有以下几个问题 1. master分支每天有很多提交,其分支代码与周部署分支&热修复分支很大可能已经不一致了,如何保证cherry-pick质量?为什么不是从待发布分支 cherry-pick 至 master 分支呢? 2. cherry-pick 操作是自动化,还是手动的?展开
作者回复: 1/ 保证cherry-pick质量保证有以下几条: 1. cherry-pick需要把依赖提交链一起cherry-pick。比如需要cherry-pick 提交A改动了文件f。A之前的提交B改动了f的相同部分。那么,B也要被遗弃cherry-pick。同时,B的依赖提交也要cherry-pick。 2. master上提交的原子性。这样可以保证上述的依赖提交可以相对安全的cherry-pick而不会产生未完成的功能暴露给用户 3. 自动化测试。 采用从master分支上cherry-pick的主要原因是确保master的健康。发布分支相对稳定,所以在上面直接修复的话,fix会错过很多最新的master上的相关修改,所以稳定性会差一些。而在master上先修复可以确保master随时可用,master更像source of truth,这是大量开发人员能够共主干的前提。 2/ cherry-pick 操作是自动化的。工具部门提供Web界面让开发人员输入commit ID,工具自动辨别其他需要cherry-pick的commit链。开发人员确认之后工具自动cherry-pick。
共 2 条评论2 - 李双2019-09-06各种分支管理策略,学习!问下,基于base开发的这种方式,是不是根据时间线,截止某一时间点(或者某个版本号之前的),代码验证过了,就可以上线了,而不是根据业务功能的先后紧急!
作者回复: 对的。这种方式是发布周期与功能解耦。版本火车一列一列发出去。功能开发者自己决定把commit搭乘哪一列。办不上的话,没办法,等下一列。
2 - 小齐2020-09-15rebase 的时候冲突为啥是 git add & git commit 而不是 git add & git rebase --continue
作者回复: 你是对的。我当时写的应该是在解决`git cherry-pick` conflict时的操作。我联系编辑修正一下。谢谢你指出错误之处!
1 - 我来也2019-11-01学习了。 以前就我一个人用git时,只能在官网(https://git-scm.com/book/zh/v2)看看文档。 很多命令都不知道在什么场景下使用。 之前看耗子书关于分支管理的文章,也是云里雾里,很多命令不知道为什么那么用。 现在新工作环境中,由于需要跟别人协作,用的git命令也是越来越多了。 现在再来看老师的这篇文章,就不再吃力了。 我现在很喜欢git rebase 和 git cherry-pick。 我也很努力的保持分支线性,看上去好看。😄 之前很小的提交都是用git merge -no-ff来合并的。 总之,这个东西是熟来生巧。展开
作者回复: git 很好玩的!对提高个人效能很有用。
1 - 果粒橙2022-05-21Git-flow 工作流,功能或者修复合并时,容易出现忘记合并到某个分支的情况。不过可以使用脚本自动化来解决。请教一下怎么自动化解决?有具体方法么?1
- K先生2022-03-20请教老师,模式一:主干分支,无功能分支,几千人的开发团队,如何做好,万一有人一提交,功能就不可用的问题,是在提交的时候就做质量门禁么?感觉此方法对人的要求非常高1
- 静水潜流,润物无声2021-12-07请教老师两个问题: 1、feature 分支与本地分支是只是叫法上的区别吗?实际在git里面是指一个意思? 2、分支让实际上就是为了方便分布全球不同local的team渐进式集成不同功能到同一代码文件,不知道这种理解是否正确。
- 小慧2021-04-14主仓库以master为主,建立功能分支。功能分支开发完成合并到测试分支,比如sit uat ,有bug直接在功能分支修改,再合并到测试分支验证。测试通过把功能分支合并到master分支,进行生产发布。这是哪个模式呢?
- bidinggong2020-10-21Facebook一直使用这种主干分支开发方式。它强迫我们把代码进行原子化,尽量确保每一个提交都尽快合入 master,并保证代码质量。实际应用后才会发现它的确很棒。
作者回复: trunk-based 开发流程实现起来有些门槛,但是效果真的好。
- 文中2020-04-12文中提到的 FB 的实践,对提交的新代码质量、新代码的测试覆盖、已有的测试覆盖率的要求都很高。对于大型的项目,还需要上下游统一写集成测试用例才能完成。怎么能保证不同业务系统的业务代码和测试代码能同时或在很短的间隔内都完成提交呢?
作者回复: 在Facebook一般的做法是被依赖这的代码先提交,并附有测试。这些代码暂时用功能开关对用户关闭,只对测试和开发者打开。然后依赖者就可以基于这个代码进行本地测试、然后check-in。这样就避免了需要同时check-in。
- Ian2020-03-24老师你好,请问一下Git-flow工作流,你提到不方便持续集成,这个点能展开说明一下吗?不太明白为什么不方便持续集成呢?谢谢。
作者回复: 不好意思回复的有点晚。最近特别忙。 原因是这样的:持续集成的最基本、也是最关键的点就是每个提交都尽快入库和其他人的代码集成。而一旦使用了功能分支,就不可避免出现延迟集成的情况。Git-flow使用了功能分支,所以持续集成做不好。
- 墨灵2020-03-24看了大厂的最佳实践,不得不感叹我司的产品管理这块的确是做得太粗糙了,可以完善的点还有很多,自己以前对git的了解也不够深入。
作者回复: 希望这个专栏能给你一些启发。
- tk2019-11-20有没有toB的分支模型建议,多客户,核心功能相同,但是多个客户可能有不同的功能集合或者定制
作者回复: 会持续开发新的功能吗?如果可以的话,推荐一个分支,使用功能开关控制。如果不行,就只能使用多个发布分支。
- Robin2019-11-15facebook 的 Trunk-based 模式感觉没有 code review 流程介入呀,开发者直接push到master就测试上线了吗?
作者回复: 有Code Review呀,请参考第5篇文章以及第12,13篇。