持续交付2-版本控制

版本控制

版本控制系统:用于维护应用程序每次修改的完整历史,包括源代码,文档,数据库定义,构建脚本,测试等.

解决问题:解决版本控制中,因为团队人数增加及功能增加引起的合并冲突问题.

分支与合并

分支的主要目的时帮助并行开发,而不互相影响.

团队中的分支使用情形:

  1. 物理上:因系统物理配置而分支,即为了文件,组件和子系统而分支
  2. 功能上:因系统功能配置而分支,即为特性,逻辑修改,缺陷修复和功能增加等
  3. 环境上:因系统运行环境而分支,即为硬件环境不同而分支
  4. 组织上:因团队工作量而分支,即为活动/任务,子项目,角色和群组而分支
  5. 流程上:因团队的工作行为而分支,支持不同规章政策,流程和状态而分支.

合并:把分支上的一些修改复制到另一个分支的过程

分支的合并往往是冲突的开始,而冲突则意味着风险.

减少分支合并冲突的方式:

  1. 早分支.创建更多分支来减少在每个分支上修改.这种方式只是分散了单次合并冲突,并没有解决核心问题
  2. 推迟分支.谨慎的创建分支,可能是每个发布才创建一个分支(稳定版本,且便于修复问题).这种方式是加速问题暴露,尽早解决.

分支与持续集成

持续集成是不断向主干分支进行代码合并,保障主干分支的良好运行.持续集成不主张多分支.
一个更可控的分支策略是:只为发布创建长周期的分支.

在这种模式下,新开发的代码总是提交到主干分支上,只有在发布分支上修改缺陷时才需要合并,而这个合并是从分支合并会主干.而只有非常严重的缺陷修复才会从主干分支合并到发布分支上.
因为代码一直处于可发布状态,所以也就更容易发布.分支越少,合并和跟踪分支的工作就越少.

实际开发中可能团队人数较多,但是这并不影响主干分支开发模式,因为实际大家编辑相同文件且发生冲突的可能较小,如果较多的话,说明项目需要进行组件化拆分,并确保组件间的松耦合.

主干分支

主干分支是持续集成的唯一分支管理方式.

优点:

  1. 确保所有代码被持续集成
  2. 确保开发人员及时获得他人的修改
  3. 随时解决合并冲突,避免分支合并时大量冲突的情形.

同时,进行复杂修改时,将它拆解为小需求就可以很好的在主干分支上进行.

主干分支存在非可发布的状态的情形,如果针对这种情况就主张多分支的话,分支管理同样也存在这种状态,同时分支管理更加复杂,不可控因素会逐渐增多.

如何使用主干分支管理一个多开发人员,多版本发布的大型团队?
良好的组件化,增量式开发和特性隐藏.

按发布创建分支

按发布创建分支:在版本即将发布前,创建分支,用于测试和验证,开发依旧在主干分支进行.

发布分支只允许进行缺陷修复,不允许进行功能开发,以减少合并冲突情形,同时提交到发布分支的补丁,最好立即合并到主干分支上.

同时团队还应该尽量避免多分支开发的情形,比如老版本客户不愿意进行升级操作.同时大型团队往往会存在多个业务线,同一个版本完成所有开发也不现实,这是进行组件化就非常重要.

发布频率如果到达一周一次时,就没有必要创建发布分支了,主干分支发布即可.发布分支不允许再创建分支.

按功能和按团队来创建分支都是不推荐的,因为这会存在大量分支,然后造成集中合并,影响代码的稳定性.同时不同分支的差异会越来越大,团队间互不了解,风险也会逐渐增大.

  • 可控分支

可控分支创建的理由:

  1. 发布新版本
  2. 调研新功能或重构
  3. 需要对应用程序做比较大的调整,但又无法较好的避免分支时,创建临时分支

可控分支创建的唯一目的:对代码进行增量式或"通过抽象来模拟分支"方式的修改

你可能感兴趣的:(持续交付2-版本控制)