颠覆分支重新整合

当一个分支被重新整合到树干上时,那个分支是否有效死亡?

你可以在重新整合后对分支进行修改,并在晚些时候将它们合并到主干中?

您可以在技术上做到这一点,您的分支没有死亡也没有被禁用,但是不推荐在重新集成之后从分支合并到主干。

你可以在这里find关于这个原因的完整讨论: Subversion合并重新集成

基本上,它说,有可能再次将更改合并到主干,但由于重新集成迫使您在重新集成操作之前从主干合并到分支,因此您将面临在Subversion 1.5中很有问题的reflection/循环合并。
根据文章,build议重新集成后立即删除重新集成的分支,并创build一个具有相同(或不同)名称的新分支。

这是一个已知的颠覆行为,将在未来的版本(可能在1.6)


实际上,你需要做一个--record-only从trunk中合并到由--reintegrate commit创build的修订版本的分支:

 $ cd trunk $ svn merge --reintegrate ^my-branch $ svn commit Committed revision 555. # This revision is ^^^^ important 

现在你logging下来

 $ cd my-branch $ svn merge --record-only -c 555 ^trunk $ svn commit 

你很高兴现在保持分支

更多信息请见第4章。分支和合并,高级合并

当你从一个分支重新整合到主干后,你应该做两件事之一:

  • 删除你的分支 。 这是最简单的,但它使得难以看到分支机构的历史。

  • 告诉你的分支不要合并重新集成提交 。 如果您重新svn merge --record-only -c X url-to-trunk到主干,并将其作为版本X提交,则可以在您的分支上运行此命令: svn merge --record-only -c X url-to-trunk 。 但是,如果作为提交的一部分进行了任何更改(除合并本身之外),则不应该这样做。 任何其他更改将永远不会让它回到你的分支。

如果有人对分支进行了多次更改(前1.5),请将合并更改的build议回想一下: 记住您在哪个版本中进行了合并 ! 或者在某个地方写下版本号, 或者 (更简单) 制作一个标签 。 (你当然可以在以后find它,但那是一个PITA。)

例:

你有一个这样的存储库布局:

 /your_project /trunk /branches /tags 

假设这是一个Web应用程序,并且您计划发布一个版本。 你会创build一个标签,并从那个(或从中继)你做错误修正的分支:

 /your_project /trunk /branches /1.0.0-bugfixes /tags /1.0.0 

这样做,您可以将新function集成到主干中。 所有的错误修正只会在错误修复分支中发生,并且在每个发行版之前,您都会创build当前版本的标记(现在来自错误修复分支)。

假设您做了相当多的错误修正,并将它们发布到生产服务器上,并且您需要在当前中继中绝望地使用这些function之一:

 /your_project /trunk /branches /1.0.0-bugfixes /tags /1.0.0 /1.0.1 /1.0.2 

您现在可以将1.0.0和1.0.2之间的更改集成到您的trunk中(假设您在工作副本中):

 svn merge http://rep/your_project/tag/1.0.0 http://rep/your_project/tag/1.0.2 . 

这是你应该记住的。 你已经在主干上合并了1.0.0和1.0.2之间的变化。 我们假设当前的产品发布有更多的变化:

 /your_project /trunk /branches /1.0.0-bugfixes /tags /1.0.0 /1.0.1 /1.0.2 /1.0.3 /1.0.4 

您现在已经准备好从trunk中释放新版本,但错误修正的最后更改仍然丢失:

 svn merge http://rep/your_project/tag/1.0.2 http://rep/your_project/tag/1.0.4 . 

现在你已经把所有的修改合并到你的主干上了,你可以发布它(不要忘记先testing它)。

 /your_project /trunk /branches /1.0.0-bugfixes /1.1.0-bugfixes /tags /1.0.0 /1.0.1 /1.0.2 /1.0.3 /1.0.4 /1.1.0 

正如大家已经在这里所说的那样:分支没有死亡,对分支的承诺可以继续下去。

有时,虽然你想在合并后杀死分支。 唯一可靠的解决scheme是删除分支。 不利的一面是,如果你想看看这个分支,比如说,出于历史原因,再次find这个分支是很难的。 所以,很多人把“重要”的分支放在身边,并且没有改变它们。 我希望有一种方法来标记一个分支死亡/只读,从而确保没有人能够承诺,直到进一步通知。

不,分支还活着,但是那一刻,它和躯干完全一样。 如果您继续在分支上开发,则可以稍后重新合并树干。

您可以根据需要多次合并分支到树干或树枝到分支。

首先,如果您仍然使用Subversion 1.7或更高版本,则应升级Subversion客户端和服务器。 没有理由使用非常古老的Subversion版本。 截至2016年,目前的版本是Subversion 1.9。 SVN 1.8现在也支持并仍然收到错误修复。

你问的问题已经在Subversion 1.8中解决了。 从SVN 1.8开始,– --reintegrate选项已被弃用 。 重新合并现在自动执行。 请参阅Subversion 1.8发行注记与改进相关的条目 。

阅读SVNBook 1.8 | 重新整合分支 :

如果您select在将其重新集成到主干后不删除分支,则可以继续从主干执行同步合并,然后再次重新合并分支。 如果您这样做,只有在第一次重新合并后在您的分支上所做的更改合并到中继。

只有Subversion 1.8支持这个function分支的重用。 之前的版本需要一些特殊的处理才能重新集成一个function分支。 有关详细信息,请参阅本章的早期版本: http : //svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

当你做一个合并,你指定的目标。 如果你喜欢,你可以将TreeA和TreeB的差异合并到TreeC中。 正如克里斯所暗示的那样,你的问题并没有太多意义。 如果您将分支合并到树干中,树枝仍然保持原样。 如果分支之后不需要,可以删除它。

您可以继续在分支上进行开发,您将需要的function是Subversion 1.5中的合并跟踪 ,这意味着来自分支的额外合并仅包含新的更改。