网络上版本管理系统之争持久而喧嚣,依照声量来说目前应该是Git占了较大的优点。不过咱们本文的关注点在于代码的分支管理模型,由于你们不管是用SVN或者Git,目的是为了解决研发过程管理中的实际问题。我这里整理几种分支管理模型,这样你们能够对照本身的痛点选择合适的模型。不过并非最灵活的方案就最好,灵活意味着分支的管理和具体研发学习曲线都更复杂。git
我先根据实际生产过程当中企业面临的问题列出一个清单:网络
另外也交代一下我所在的公司背景:
咱们是一家企业内部学习培训的人力资源SAAS管理平台,对于平台改进有本身的规划和目标,可是又面临着大客户的定制化需求以及交付时间压力。技术栈仍是Java和.Net 双栈并存,因此能够说是最复杂的研发环境了。咱们也慢慢衍生出了本身的一套改进的代码版本管理模型。工具
原理1:研发团队在名称为 Trunk 的单一分支进行开发,当开发工做到必定阶段的时候达到可发布条件后,切出Release分支进行发布,而且Release分支是不能够修改的仅仅作发布使用。大部分SVN用户是基于本模型进行开发。
适合小团队的模型,你们都直接在Trunk上进行开发
post
适合较大团队的模型,你们切出短时间的特性分支进行开发,完成后合并回Trunk。
学习
适用场景:适合于单一稳定产品线,迭代排期稳定,需求边界彻底可控的团队。
优势:模型简单
缺点:测试
总结:Trunk Based最大的优点就是清晰简单,付出的代价就是灵活性,基本能够说不存在任何灵活性。适用的场景我以为是进入到后期维护的大型系统,不会作太多的变动而且不会有太多的突发问题。插件
GitFlow来源应该是 Vincent Driessen 在2010年1月发表的这篇《A successful Git branching model》,基本是如今Git中最出名的流程管理方法了。
3d
这张图相信你们都不陌生。
原理:
主要分为5个分支code
总结:Gitflow已经很偏向互联网风格的代码管理,考虑到了多环境、线上修正。并且如今不少IDE或者工具备整合了GitFlow的插件使用起来会更简单。对于有良好规划和进度控制的项目,应该是已经够用了。可是对于一些有交付日期的,可是需求池能够调整的项目可能还不够灵活。
阿里的研发效能事业部专家基于TrunkBased和GitFlow提出了一套新思路:AoneFlow。
原理:AoneFlow 只使用三种分支类型:主干分支、特性分支、发布分支,以及三条基本规则。
开始工做前,从主干建立特性分支。
经过合并特性分支,造成发布分支。
发布到线上正式环境后,合并相应的发布分支到主干,在主干添加标签,同时删除该发布分支关联的特性分支。
缺点:
总结:AoneFlow最重要的点,就是保证master分支可用和随时可发布,其余可能都是临时分支。因此取名的时候应该是Ali-One-Flow,这个含义。临时分支的组装就有不少种玩法了,须要企业根据本身的须要来定制处理。
OneFlow我找到两个版本,一个是国内版本,一个是国外的版本。
国内版本:
原理:此模式是TrunkBased的升级版,增长了Hotfix分支,采用多主干模式,通常是双主干(一个主干分支+一个主干发布分支)。OneFlow在TrunkBased模式演进中,作了一此改善,分离了主干分支和发布分支,有效的规避了一些问题。可是一样还不能知足多版本,多产品的并行开发。
国外版本:
原理:此模式是GitFlow的简化版本,可是(做者认为)并不比GitFlow逊色。主要也就是双分支2,除了主干分支,只会额外保持一个分支,在不一样的阶段切除特性、发布、修正分支
并且还提供了变种版本,master+develop 双主干分支的模式。
总结:国外版本的OneFlow发表在2017年,我以为他肯定了基于一个,最多两个的固定分支进行开发这种原则。提供了企业版本管理过程当中的最佳实践原则,(我以为)也启发了AoneFlow这种优秀的Flow。
ExeFlow是咱们公司目前在使用的代码管理流程的名称,主要是吸收了AoneFlow的思想,同时根据咱们本身的环境进行一些流程和分支的固化。
要理解这个Flow流程,首先基于咱们的实际工做场景:
咱们的系统因为主要是面向大型企业内部使用,存在复杂的分发流程和权限控制,通过长时间的累积业务模型也很复杂各类关联和引用,因此有一些大型任务的开发周期可能会比较长,到达2-3个月的周期。
咱们的迭代周期正常是1个月。流程大概以下:
主要经历了2个大版本的变化
版本1,基本是参考GitFlow
这个版本的固定独立分支是三条:Master,Develop,Local。核心在于Release分支仍是由Develop创建,对于需求变动的支持性不够灵活。
版本2,是参考AoneFlow
(上图就是使用gitgraphjs绘制的)
这个版本的固定独立分支也仍是是三条:Master,Develop,Local。
可是核心差别在于Release分支是由Master创建,而且合并须要上线的Feature分支,而Release分支在咱们企业的流程中只会存在2-3天的时间。
总结:实际上是比较复杂的流程,并且研发的操做的内容实际更多。咱们还要锁定某些分支,设定权限管理。可是解决了咱们的问题,因此从上到下都能替换到复杂流程带来的好处。
若是你完整看完了这篇文章,实际上如今须要的并非立刻选择当前企业应该选用哪种Flow管理模型,而是认真的思考企业实际面临的问题和痛点。越灵活的流程越复杂,对于研发人员初期的接收难度就越高。咱们想真正让研发团队理解并接受某个管理模型,最重要的是这个东西解决了企业面临的问题。才能让管理层、研发自身体会到好处。
我看了不少版本管理软件的对比,不管是抬Svn打Git或者反之,我以为都对也都不对。由于不管管理或者技术,自己没有对错优劣,问题是场景。若是一个简单稳定的后期维护项目,强推复杂的管理流程,效果不会好,由于没有解决任何问题,只会引入问题。
管理的核心在于解决问题,而不是管理行为自己。