你什么时候分支?

在使用SCM系统时,你应该什么时候分支?

分支有几个用途。 最常见的用途之一是分离曾经具有共同代码基础的项目。 这对您的代码实验非常有用,而不会影响主干。

一般来说,你会看到两种分支types:

  • function部门:如果一个特定的function足够干扰,您不希望整个开发团队在早期阶段受到影响,您可以创build一个分支来完成这项工作。

  • 修复分支:在主干上继续开发的同时,可以创build一个修复分支,以修复最新发布的软件版本。

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

  • Ned Batchelder – Subversion分支快速入门

总的来说,分支(VCS – 版本控制系统 – 特性)的主要目的是实现代码隔离

你至less有一个分支,这对于顺序开发是足够的,并且用于许多正在logging(提交)在同一个唯一分支上的任务。

但是这个模型很快显示出它的极限:

当你有一个开发工作(重构,进化,错误修正,…),你意识到你不能安全地在同一个分支比你当前的开发分支更改(因为你会打破API,或引入代码将破坏一切), 那么你需要另一个分支。
(为了隔离传统代码的新代码,即使稍后将这两个代码集合合并)

所以这就是你的答案
你应该分支,只要你不能追求和logging在一个分支的两个发展努力。
(没有可怕的复杂的历史维护)。


即使你是唯一一个在源代码上工作的分支,如果你很多,分支也是有用的。
但是你不应该让“每个开发者一个分支”:
“隔离”的目的是隔离一个开发工作 (一个可以像“开发我们的软件的下一个版本”一样的任务,或者像“修复bug 23”一样具体)
不要孤立一个“资源”

(一个名为“VonC”的分支对另一个开发者没有任何意义:如果“VonC”离开该项目,该怎么办?你应该怎么做?
一个名为“bugfix_212”的分支可以在bug跟踪系统的上下文中解释,例如任何开发人员至less可以用它来理解他应该怎么做)

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

定义一个分支也意味着定义一个合并工作stream :当你完成分支时,你需要知道你的分支在哪里合并。
为此,Practical Perforce(Laura WINGERD – O'Reilly)的第7章介绍了如何在不同types的分支之间合并工作stream程(VCS不可知论者):“” 软件如何演化 “(pdf)

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

它引入了主线模型(logging版本的中央代码行),并描述了分支的各种用途:

  • 积极的开发stream程 :当连续的各种开发发生时,持续的代码行
  • 任务分支 :用于更具体的任务的短命分支(bug-fix是一个经典的分支,但是你也可以定义一个分支来完成你知道要完成的合并工作:你可以在任务分支中合并,提交和testing而不会为当前的主要发展部门带来问题)
  • 分段分支 :用于准备发布,具有一些预生产特定数据或configuration文件。
  • 私人分支机构,临时分支机构和稀疏分支机构 :对于非常小的任务,只是为了能够进行一些正在进行的工作,而不用等待正式的完成或testing审查。
    这允许“提早做出,经常做”。

其他有关VCS的有趣概念: 基本概念
(关于ClearCase最初,也适用于任何VCS)

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

为你的每一个任务分支 ,不pipe这是一个新function,一个错误修正,一个testing,不pipe。 这就是所谓的主题分支,它改变了你使用SCM的方式。

你得到:

  • 更好的隔离
  • 更好的可追溯性 – >您将任务与分支相关联,而不是单个变更集,这使您可以随意多次提交,并且不会像“每个任务一次签入”那样施加限制。
  • 任务是独立的(通常从一个稳定的基线开始,所以你只关注你的代码,而不是修复你的人的错误),你可以select是否要在某个时间点或之后整合它们,但是它们总是在版本控制
  • 您可以轻松地检查代码(从版本控制,而不是预先提交废话),然后再击中主线

可以做到的工具:

  • 混帐
  • 水银
  • 塑料SCM

不能做的工具:

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

这也取决于你正在使用的SCM工具。 现代SCM(git,mercurial等)使得越来越容易在需要时创build和销毁分支。 例如,这使您可以为每个正在处理的错误创build一个分支。 一旦你将结果合并到主干中,就丢弃分支。

其他的SCM,例如subversion和CVS,有一个“更重”的分支范例。 这意味着,一个分支被认为只适用于大于二十行的补丁。 在那里,分支机构通常用于跟踪整个开发轨道,比如以前或未来的产品版本。

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

这取决于你正在使用的SCMtypes。

在较新的分布式版本(如git和mercurial)中,无论如何你总是在创build分支并重新合并。 我经常在一个单独的分支上工作一段时间,只是因为有人破坏了主线上的构build,或者因为networkingclosures了,然后在修复时将修改合并回来,这样做很容易,甚至没有烦人。

最能帮助我理解分布式系统中发生了什么的文档(简短易读)是: UnderstandingMercurial 。

在具有中央存储库(比如CVS,SVN和ClearCase)的旧系统中,这是一个更为严重的问题,需要在团队层面上决定,答案应该更像是“保留旧版本,同时允许发展继续在主线上“,或”作为重大试验的一部分“。

我认为分布式模型要好得多,而且缺乏很好的graphics工具来成为主要的范例。 然而,它并没有被广泛的理解,而且概念是不同的,所以新用户可能会感到困惑。

我发现Perforce的Laura Wingerd&Christopher Seiwald的build议非常简洁和有用:

* Branch only when necessary. * Don't copy when you mean to branch. * Branch on incompatible policy. * Branch late. * Branch, instead of freeze. 

请参阅sites/default/files/pdf/perforce-best-practices.html ,详细解释其中的每一项以及其他最佳做法。

分支有多种用途:

  1. function/错误分支。 当function/错误修复完成后,dynamic和活动分支会移回到主干中。
  2. 静态分支(Subversion中的标签,虽然本质上只是一个“普通分支”)。 它们提供了一个释放的静态快照。 即使他们可以工作,他们仍然没有被触动。

当您需要根据您当前的分支进行更改时,而不是从该分支的下一个版本(而不是之前)。

例如,我们通常在干线上工作。 在发布的时候,有人需要做一些我们不希望在当前发行版中进行的更改(可能是在发布之前,现在通常是在发布之后)。 这是当我们分支时,把发布放在自己的分支上,继续发展下一个版本的主干。

分支的需要也可能出现:

  • 当您想要为特定客户提供修补程序(重要),并且您不确定修补程序是否将成为未来版本的一部分
  • 抛开所有的技巧

    当你知道它更容易合并回来!

    请记住,合并将始终受到工作如何在项目中执行的影响。

    一旦达到这个目标,所有其他的高等教育问题都将发挥作用。

    每当你感觉像。

    如果你使用集中的SCM,你可能不会很频繁,因为分支机构是官方存储库的一部分,这并不需要太多的实验,更不用说合并真的会受到伤害。

    OTOH,在分布式SCM中分支和结帐之间没有技术上的区别,并且合并更容易。 你会觉得更经常分支一大堆。