题 Subversion存储库中“分支”,“标记”和“主干”的含义是什么?


我已经在Subversion(我猜通用存储库)讨论中看到了很多这样的话。 在过去的几年里,我一直在为我的项目使用SVN,但我从来没有掌握这些目录的完整概念。

他们的意思是什么?


1133
2017-08-19 13:22


起源


这是一篇很好的文章,我试着解释如何/何时使用trunk,branch和tags。我之前没有使用过源代码控制,但这篇文章让我很容易理解像我这样的菜鸟。 Subversion的日常工作 - badmoon


答案:


嗯,不确定我同意Nick重新标记类似于分支。标签只是一个标记

  • 树干 将成为发展的主体,从项目的开始直到现在。

  •  将是从主干中某一点派生的代码副本,用于对代码进行重大更改,同时保留主干中代码的完整性。如果主要变更按计划运作,它们通常会合并回主干。

  • 标签 将是您希望保留的树干或树枝上的某个时间点。保存的两个主要原因是这是软件的主要版本,无论是alpha,beta,RC还是RTM,或者在应用主干的主要修订之前,这是软件中最稳定的一点。

在开源项目中,项目利益相关者不接受主干的主要分支机构可以成为基础 叉子  - 例如,与其他源代码共享共同起源的完全独立的项目。


867
2017-08-19 13:35



与标签和分支的混淆是在svn中除了目录的名称之外,它们之间确实没有区别。在svn中,您可以对标记进行更改,实际上很难防止这种情况发生。大多数其他VCS将标记视为不可变快照(时间点)。 - Ken Liu
Tags 目录也经常用于常规用户的里程碑测试和验证。这也是放置原型的好地方(只是我头脑中的一些想法)。 - Jeff Noel
@KenLiu有一些钩子可以使标签不可变。也就是说,您可以创建并签出代码,但不能进行任何更改。当然,标签只是存储库的一部分意味着可以获得完整的历史记录。如果有人更改了标签,您可以跟踪该标签以及原因。在许多VCS中,如果您修改标签,可能没有任何方法可以知道。 - David W.
也许 稳定的分支 应该提到:通常没有做出的改变 合并回主干。 - Wolf
我的理解是,在一个“完美的世界”中,在主干中不应该发生任何开发,主干应该始终是现场的确切代码或即将被释放到现场的代码。因此,这将使分支机构成为发展的主体。 - MikeT


首先,正如@AndrewFinnell和@KenLiu指出的那样,在SVN中,目录名称本身没有任何意义 - “主干,分支和标签”只是大多数存储库使用的常见约定。并非所有项目都使用所有目录(根本不使用“标签”),事实上,没有什么能阻止你将它们称为任何你想要的东西,尽管违反常规通常会令人困惑。

我将描述分支和标记的最常见使用场景,并给出一个如何使用它们的示例场景。

  • 树干:主要开发区。这是您下一个主要版本的代码所在的位置,并且通常具有所有最新功能。

  • 分行:每次发布主要版本时,都会创建一个分支。这允许您进行错误修复并制作新版本,而无需发布最新的 - 可能未完成或未经测试的功能。

  • 标签:每次发布版本(最终版本,发布候选版本(RC)和beta版本)时,都会为其创建一个标记。这为您提供了该状态下代码的时间点副本,允许您在过去的版本中返回并重现任何错误,或者完全按照原样重新发布过去的版本。 SVN中的分支和标签是轻量级的 - 在服务器上,它不会生成文件的完整副本,只是标记“这些文件在此版本中被复制”,只占用几个字节。考虑到这一点,您永远不应该担心为任何已发布的代码创建标记。正如我之前所说,标签经常被省略,相反,更新日志或其他文档在发布时澄清了修订号。


例如,假设你开始一个新项目。你开始在“trunk”中工作,最终将作为1.0版本发布。

  • trunk / - 开发版,很快就会是1.0
  • 分支/ - 空

1.0.0完成后,将trunk分支到新的“1.0”分支,并创建一个“1.0.0”标记。现在继续研究最终将继续在主干中运行的1.1。

  • trunk / - 开发版, 很快将是1.1
  • branches / 1.0 - 1.0.0发布版本
  • tags / 1.0.0 - 1.0.0发布版本

您在代码中遇到一些错误,并在trunk中修复它们,然后将修复程序合并到1.0分支。您也可以执行相反的操作,并修复1.0分支中的错误,然后将它们合并回主干,但通常项目坚持单向合并以减少丢失某些内容的机会。有时一个bug只能在1.0中修复,因为它在1.1中已经过时了。这并不重要:您只想确保不使用1.0中修复的相同错误发布1.1。

  • trunk / - 开发版,很快将是1.1
  • branches / 1.0 - 即将发布的1.0.1
  • tags / 1.0.0 - 1.0.0发布版本

一旦找到足够的错误(或者可能是一个关键错误),您就决定发布1.0.1版本。因此,您从1.0分支创建标记“1.0.1”,并释放代码。此时,trunk将包含1.1的内容,“1.0”分支包含1.0.1代码。下次将更新发布到1.0时,它将是1.0.2。

  • trunk / - 开发版,很快将是1.1
  • branches / 1.0 - 即将发布的1.0.2
  • tags / 1.0.0 - 1.0.0发布版本
  • tags / 1.0.1 - 1.0.1发布版本

最终你几乎准备好发布1.1,但你想先做一个测试版。在这种情况下,您可能会执行“1.1”分支和“1.1beta1”标记。现在,继续在trunk中继续工作1.2(或者可能是2.0),但在1.1的分支中继续工作1.1。

  • trunk / - 开发版, 很快就会是1.2
  • branches / 1.0 - 即将发布的1.0.2版本
  • branches / 1.1 - 即将发布的1.1.0版本
  • tags / 1.0.0 - 1.0.0发布版本
  • tags / 1.0.1 - 1.0.1发布版本
  • tags / 1.1beta1 - 1.1 beta 1发行版

一旦你发布了1.1 final,你就会从“1.1”分支中做一个“1.1”标记。

如果您愿意,还可以继续维护1.0,在所有三个分支(1.0,1.1和trunk)之间移植错误。重要的是,对于您正在维护的软件的每个主要版本,您都有一个分支,其中包含该版本的最新版本代码。


分支的另一个用途是用于特征。这是您分支主干(或您的一个发布分支)并单独处理新功能的地方。功能完成后,将其重新合并并删除分支。

  • trunk / - 开发版,很快就会是1.2
  • branches / 1.1 - 即将发布的1.1.0版本
  • branches / ui-rewrite - 实验特征分支

这样做的想法是当你在破坏性的东西(会阻碍或干扰其他人做他们的工作),实验性的东西(甚至可能没有),或者可能只需要很长时间的东西(当你准备从主干分支1.2时,你担心如果它支持1.2版本),你可以在分支机构中单独进行。通常,您可以通过将更改合并到主干来使其保持最新状态,这样可以在完成后更轻松地重新集成(合并回主干)。


另请注意,我在这里使用的版本控制方案只是其中之一。有些团队会将错误修复/维护版本发布为1.1,1.2等,主要更改为1.x,2.x等。此处的用法相同,但您可以将分支命名为“1”或“1” .x“而不是”1.0“或”1.0.x“。 (在旁边, 语义版本控制 如何做版本号是一个很好的指南)。


537
2017-09-20 19:00



在SVN标签中是轻量级的,这是不正确的。在SVN中,标记是完整的代码导出,并且丢失对它们所源自的源树中的位置的任何引用。 - baruch
@baruch - 这是完全错误的。标签是轻量级的(就Subversion本身而言)与分支相同。 - Josh Kelley
喜欢用例细节。谢谢@gregmac。 - Jeromy French
我可以得到关于标签/分支是轻量级的说法吗?它似乎不是这样的.. - Cardin
@Cardin我现在没有引用,但重要的是注意标记在服务器上是轻量级的,但不是客户端。如果您签出所有标签,您将获得许多完整副本。但是,如果查看服务器上的存储库大小,每个标记只会增加几个字节。这就是为什么你不应该检查根目录,一般来说。 - gregmac


除了尼克所说的你还可以找到更多信息 流线:并行软件开发的分支模式

enter image description here

在这个图中 main 是树干, rel1-maint 是一个分支和 1.0 是一个标签。


92
2017-08-19 13:58



你不是在谈论Subversion,对吗? - Wolf
@Wolf他可能 - 无论工具如何,该图表都非常通用。所有单片机使用不同的单词但概念相同,主干和主单元之间没有区别;或者主干和主人。该图显示了我当前公司如何使用SVN。 - gbjbaanb
@gbjbaanb感谢分享。 ...和 标签 这个问题似乎没有解决。是不是纯粹的巧合(也是在你现在的公司)没有合并从主要分支到维护分支? - Wolf
@Wolf没有巧合 - 只从树干分支,做工作,合并回主干。然后将主干分支到标签分支。我们正在考虑另一个名为Integration的“主干”,它已经完成了与它合并的分支以进行不构成发布的测试,主干仍然用于我们决定在下一个版本中放入的分支。您从主干到分支的唯一合并时间是更新一个长时间运行的分支,但它更好(更简单)只需创建一个新的分支关闭主干,并在需要时将旧分支的更改合并到它。 - gbjbaanb


一般来说 (工具不可知视图),分支是用于并行开发的机制。 SCM可以具有0到n个分支。 Subversion有0。

  • 树干 是一个主要的分支 推荐的 通过Subversion,但你绝不会被迫创造它。你可以称之为“主要”或“发布”,或者根本就没有!

  •  代表着一种发展努力。它永远不应该在资源之后命名(比如'vonc_branch')但是在之后:

    • 目的'myProject_dev'或'myProject_Merge'
    • 释放周长'myProjetc1.0_dev'或myProject2.3_Merge'或'myProject6..2_Patch1'......
  • 标签 是文件的快照,以便轻松返回到该状态。 问题是Subversion中的标签和分支是相同的。我肯定会推荐偏执的方法:

    您可以使用Subversion提供的访问控制脚本之一来阻止任何人做任何事情,除了在标签区域中创建新副本。

标签是最终的。它的内容永远不会改变。决不。永远。你在发行说明中忘了一行?创建一个新标签。废弃或删除旧的。

现在,我读了很多关于“在这样的分支中合并这样的东西,然后最终在主干分支中”。 它被称作 合并工作流程 并且有 没有必要在这里。这不是因为你有一个主干分支 必须合并回来 任何东西。

按照惯例,trunk分支可以表示开发的当前状态,但这是一个简单的顺序项目,即具有以下项目的项目:

  • 没有“提前”开发(用于准备下一个版本,意味着这些更改,它们与当前的“主干”开发不兼容)
  • 没有大规模的重构(用于测试新的技术选择)
  • 没有长期维护以前的版本

因为有了这些场景中的一个(或全部),你会得到四个“中继”,四个“当前的发展”,而不是你在那些并行开发中所做的一切都必须在“主干”中合并。


73
2017-08-19 13:25



另请参见“何时分支?”: stackoverflow.com/questions/2100829#2107672 - VonC


在SVN中,标签和分支非常相似。

标签 =定义的时间片,通常用于发布

 =也是一个定义的时间片,开发可以继续,通常用于主要版本,如1.0,1.5,2.0等,然后当你释放你标记分支。这使您可以继续支持生产版本,同时继续进行中断更改

树干=开发工作空间,这是所有开发应该发生的地方,然后更改从分支版本合并回来。


36
2017-08-19 13:27





它们实际上没有任何正式含义。文件夹是文件夹 到SVN。它们是组织项目的普遍接受的方式。

  • 行李箱是您保持主要发展方向的地方。您可以在分支文件夹中创建分支文件,这些文章很难在短文中解释。

  • 分支是项目子集的副本,您可以与主干分开处理。也许是因为实验可能不会出现在任何地方,或者可能是下一个版本,当它变得稳定时你将稍后合并回主干。

  • tags文件夹用于创建存储库的标记副本,通常是在发布检查点。

但就像我说的,对SVN来说,文件夹是一个文件夹。 branchtrunk 和标签只是一种惯例。

我正在大量使用“复制”这个词。 SVN实际上并不在存储库中制作完整的东西副本。


28
2017-08-19 13:37





树干 是包含最新源代码和功能的开发线。它应该有最新的错误修复程序以及添加到项目中的最新功能。

分支机构 通常用于远离主干(或其他开发线)的东西 打破 构建。新功能通常构建在分支中,然后合并回主干。分支通常包含不一定被批准用于其分支的开发线的代码。例如,程序员可以尝试对分支中的某些内容进行优化,并且只有在优化满意后才会在开发行中合并。

标签 是特定时间的存储库的快照。这些都不应该发展。它们通常用于获取发布到客户端的副本,以便您可以轻松访问客户端正在使用的内容。

这是一个非常好的存储库指南的链接:

维基百科的文章也值得一读。


12
2018-06-30 11:50





现在这就是关于软件开发的问题,对于任何事情都没有一致的知识,每个人似乎都有自己的方式,但那是因为无论如何它都是一个相对年轻的学科。

这是我简单明了的方法,

树干  - trunk目录包含最新,已批准和合并的工作主体。与许多人承认的相反,我的行李箱仅用于清洁,整洁,批准的工作,而不是开发区域,而是一个释放区域。

在某个给定的时间点,当主干似乎都准备好释放时,它会被标记并释放。

分支机构  - branches目录包含实验和正在进行的工作。分支机构的工作停留在那里,直到被批准合并到主干。对我来说,这是完成所有工作的领域。

例如:我可以有一个 迭代-5 分支机构对产品进行第五轮开发,也许是一个 原型9 分支进行第九轮试验,依此类推。

标签  - tags目录包含已批准的分支和主干版本的快照。每当分支机构被批准合并到主干中,或者发布主干时,都会在标签下创建已批准的分支或主干版本的快照。

我想,有了标签,我可以很快地来回穿过时间点兴趣点。


10
2017-08-19 13:28