什么时候应该分支?

Ben*_*Ben 105 version-control branch

使用SCM系统时,何时应该分支?

Von*_*onC 79

总的来说,分支的主要目的(VCS - 版本控制系统 - 功能)是实现代码隔离.

您至少有一个分支,足以进行顺序开发,并用于在同一个唯一分支上记录(提交)的许多任务.

但该模型迅速显示其限制:

当您进行开发工作(重构,演变,错误修复,......)并且您意识到您无法在与当前开发分支相同的分支中安全地进行这些更改(因为您会破坏API,或者引入会破坏的代码)一切),然后你需要另一个分支.
(为了隔离旧代码的新代码,即使稍后将合并这两个代码集)

那么这就是你的答案:
只要你不能在一个分支中追求和记录两个开发工作,你就应该分支.
(没有一个非常复杂的历史来维护).


即使你是唯一一个处理源代码的人,如果你很多,分支也很有用.
但是你不应该为每个开发人员制作一个分支:
"隔离"的目的是隔离开发工作(这个任务可以像"让我们开发软件的下一个版本"一样通用,或者像"让我们修复"一样具体错误23"),
而不是隔离"资源".

(一个名为"VonC"的分支对另一个开发者来说没有任何意义:如果"VonC"离开项目怎么办?你应该用它做什么?
一个名为"bugfix_212"的分支可以在bug跟踪系统的上下文中解释,任何开发人员都可以使用它至少有一些关于他应该用它做什么的想法)

分支不是标签(SVN是一个修订系统,它试图提出版本控制功能,如分支和标记通过廉价文件副本的目录:这并不意味着标签是一个分支)

定义分支还意味着定义合并工作流:您需要知道在完成分支时合并分支的位置.
为此,Practical Perforce的第7章(La​​ura WINGERD - O'Reilly)是一个很好的介绍(VCS不可知),用于合并不同类型的分支之间的工作流程:"" 软件如何发展 "(pdf)

它定义术语代码行(分支记录代码的重要演变步骤,通过某些点的标记,或通过重要的合并回到分支)

它介绍了主线模型(记录发布的中心代码行),并描述了分支的各种用途:

  • 活跃的开发流:当顺序的各种开发发生时,持久的代码行
  • 任务分支:用于更具体任务的短期分支(错误修复是一个经典的分支,但您也可以为合并工作定义一个分支,您知道要完成复杂:您可以在该任务分支中合并,提交和测试没有为主要的当前开发分支引入问题)
  • 暂存分支:用于准备发布,具有一些预生产特定数据或配置文件.
  • 私有分支,临时分支和稀疏分支:对于非常小的任务,只是为了能够在不等待正式完成或测试审查的情况下提交正在进行的工作.
    这允许"提前提交,经常提交".

关于VCS的其他有趣概念:基础概念
(最初关于ClearCase,但对任何VCS也有效)


Dan*_*llo 58

分支有几种用途.最常见的用途之一是分离曾经具有公共代码库的项目.这对于试验代码非常有用,而不会影响主干.

通常,您会看到两种分支类型:

  • 功能分支:如果某个特定功能具有破坏性,您不希望整个开发团队在其早期阶段受到影响,您可以创建一个分支来执行此工作.

  • 修复分支:在主干上继续开发时,可以创建修复分支以将修复程序保存到最新发布的软件版本中.

您可能有兴趣查看以下文章,该文章解释了分支的原理以及何时使用它们:


pab*_*blo 18

所有21世纪的SCM都在告诉你:

分支你要处理的每一项任务,无论这是一个新功能,一个错误修正,一个测试,等等.这称为主题分支,它会改变您使用SCM的方式.

你得到:

  • 更好的隔离
  • 更好的可追溯性 - >您将任务与分支相关联,而不是单独的变更集,这使您可以自由地提交任意次数,并且不会施加"每次任务一次检查"等限制.
  • 任务是独立的(通常从稳定的基线开始,因此您只关注您的代码,而不是修复您的人员的错误),您可以选择是否要在某个时间点或之后集成它们,但它们总是在版本控制
  • 您可以在点击主线之前轻松查看代码(从版本控制,而不是预先提交废话)

可以做到的工具:

无法做到的工具:

  • SVN
  • CVS
  • VSS
  • TFS
  • Perforce公司

  • SVN并不是很好的合并.由于缺乏适当的合并跟踪.另外,因为创建一个分支并不像我指出的那样便宜,它最终会成为真实条件下的噩梦. (3认同)
  • 你为什么不能使用Perforce? (3认同)
  • @PaimanSamadian 多次签入非常适合解释中间更改并简化审查。此外,如果您在某件事上工作了几个小时,那么多次签到也很棒。 (2认同)

Fre*_*red 8

它还取决于您使用的SCM工具.现代SCM(git,mercurial等)使得在需要时创建和销毁分支变得越来越容易.例如,这允许您为每个正在处理的错误创建一个分支.将结果合并到主干后,您将丢弃分支.

其他SCM,例如颠覆和CVS,具有更"重"的分支范例.这意味着,分支被认为仅适用于大于二十几行补丁的东西.在那里,分支通常用于跟踪整个开发轨道,如先前或未来的产品版本.


Dom*_*ger 5

当您需要对代码库进行重大和/或实验性更改时,特别是如果您要提交中间更改,而不影响主干.


Joh*_*den 5

这取决于您使用的SCM类型.

在较新的分布式版本(如git和mercurial)中,您始终在创建分支并重新进行重新分类.我经常在一个单独的分支上工作一段时间只是因为有人破坏了主线上的构建,或者是因为网络已经关闭,然后合并后的更改会在以后修复,并且它很容易做到它甚至不讨厌.

最能帮助我理解分布式系统中的内容的文档(简短且可读)是:UnderstandingMercurial.

在具有中央存储库的旧系统中(如CVS,SVN和ClearCase),这是一个需要在团队级别决定的更严重的问题,答案应该更像是"在允许的同时保持旧版本发展继续在主线',或'作为主要实验的一部分'.

我认为,分布式模型要好得多,并且缺乏很好的图形工具才能成为主导范例.然而,它并没有被广泛理解,并且概念是不同的,因此它可能会让新用户感到困惑.


归档时间:

查看次数:

33598 次

最近记录:

7 年,6 月 前