什么是GitHub上的版本化分支?

时间:2014-08-01 17:35:23

标签: github dvcs branching-and-merging

在GitHub上,有时我会看到" 1.x"和" 2.x"分支,除了标签。以Grails SpringSec plugin为例。它有master1.x分支,以及多个标记。

这让我很好奇:

  • 这些" 1.x"和" 2.x" (等)"版本分支"被创造?他们会在什么时候与master合并?
  • 在什么时候从这些"版本分支构建工件"?换句话说," 1.x"可能意味着" 1.0.0"或" 1.5.29" ...但最新版本可能是" 1.7.14"。 " 1.x"之间的关系是什么?分支和" 1.7.14"二进制版本(JAR,ZIP,等等)?
  • 如果您已经使用"版本分支",那么标签可能用于什么目的?

2 个答案:

答案 0 :(得分:3)

这里简要说明了分支和标签的工作原理以及如何最好地使用它们。

<强> 1。分支

分支提供了将代码分成不同开发流的方法。最初,您从一个主分支开始(无论是mastertrunk还是其他常见名称。随着项目的发展,您在开发过程中开始需要一定的稳定性。

保证这一点的一个好方法是开始为您的工作使用多个分支。请考虑以下事项:您正在研究其开发工作量高和/或长期的功能。你不希望在你的主分支中有这个,如果它会改变你现有代码的行为,就像它正在进行的工作一样,你可能会破坏一些东西为了其他人。因此,这是您通常创建功能(或主题)分支时。当代码变得足够稳定时,将功能分支与相应的主服务器合并。这种方法可以帮助您与其他开发人员隔离开来。他们可以检查您的工作并对其进行评论,同时提出修正建议,同时保持master稳定。

<强> 2。代码

标签是永久性的东西。它们是您在给定时间点的代码的标记。当您发布版本1.2.3时,您需要能够告诉 完全 此版本中的内容,如果有人报告错误,那么您就可以轻松地重现它,并检查在您开发新版本的后期开发过程中是否已经解决它。

第3。与分支机构合作并从中释放

考虑您有多个客户。假设ClientA与您签订合同,他们将付费使用版本1.2.3,而ClientB是一个新客户,对您在版本{{1}中的某些功能方面的突破性工作感兴趣} 2.x并未全部大肆宣传,因此不愿意升级到。您的合同规定每个客户在支付许可证后一年内获得服务。是的,通常公司应该推动他们的客户升级到他们的产品/服务的新版本,但通常客户是大型机构,其中工作和决策的速度比期望慢得多。

因此,为了能够支持两个客户端,您需要确保拥有适当的分支策略,并且您将能够独立工作。这通常意味着你有一个像master这样的主分支,你的所有前沿开发都已完成。当某些功能准备就绪时,如果这些客户端的相应分支上需要它们,则它们将合并到其分支机构。因此,如果您在ClientA上开发feature-15并且master需要它,则只需将其合并到其分支中。如果ClientB报告的关键问题似乎只与其产品版本相关且在以后的版本中无法重现,那么您只需为它们应用修补程序并推出一个版本。

通常情况下,您的合同不会给您的客户提供某些功能,除非他们已为此付费。您的定价模式可以是年度服务,涵盖全年免费升级,涵盖次要和主要版本。您可能还有一些客户,这些客户几年前已经签署过,并且升级速度非常慢,因此需要保持不同版本行的存活时间更长。

<强> 3.1。多分支环境中的分支和标记

考虑您有以下分支:

  • ClientA:最新发展(3.x)

  • master:对于坚持使用旧版代码的客户

  • 1.x:了解更多最新客户。

分支2.x将用于发布1.x - s; 1.x-SNAPSHOT2.0和主人 - 为您尚未发布的3.x.通常情况下,每个主要版本的分支都是一个好主意,您正在积极支持。对于未成年人,您将分支该分支(例如,版本2.0.3将在分支2.x-SNAPSHOT之外)。当您对特定迭代功能的工作被认为已经完成并且足够稳定时,您可以为正在开发的版本创建该分支的标记,并将当前开发的版本提升到下一个次要版本。我抽象地谈论,因为你还没有提到你正在使用的构建工具。例如,使用Maven,当前正在开发的版本将是2.0.x,如果您当前发布的版本来自分支SNAPSHOT而您的开发版本是2.x,那么您新发布的版本将是是2.3-SNAPSHOT,您的下一个开发版本是2.3

我希望现在这一切都更有意义。

答案 1 :(得分:0)

首先,1.x分支在技术上只是一个分支名称,如devaFeature或任何其他字符串。

这是版本控制的不同模型。例如,如果您为不同版本销售不同的许可证,这是有道理的。

在此模型中,您通常不会将分支合并回主服务器。如果您启动新版本,则启动这些分支。然后你将它们保持与主分支平行。

然后通过设置“标签”,直接在这些分支上构建您的版本(您称之为工件)。之后,您可以继续在同一分支上进行开发。例如: 我们创建了一个分支2.x。在该分支上开发一段时间之后,我们只需创建一个标记2.1.0并继续在该分支上进行开发。在同一分支上修复了一些错误标记2.1.1,依此类推。对分支3.x4.x进行了相同的工作。

因此,标签的目的是冻结代码的某种状态并将其提供给最终用户。