SVN合并分支 - 主干分支

时间:2014-03-07 13:00:11

标签: svn version-control merge

我做了些蠢事。我已经将trunk合并到我的分支中进行同步并提交,然后将我的分支合并到trunk而不使用-reintegrate选项并提交。当然我的分支仍处于开发过程中,我需要它,但我得到了

svn:E195016 ...只有先前通过“http://some.pl/trunk”将修订版x合并到重新整合来源时才能使用重新整合,但事实并非如此 缺少范围...

不幸的是,干线从那时开始,所以我的分支机构不是最新的。

解决问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

只是那样做了吗?如果是这样,您可以使用svn merge取消合并您的更改。我们假设你在版本1234中合并了分支到主干:

$ svn co $repo/trunk
$ cd $trunk
$ svn merge -c -1234 .   # Removes the merge that took place in revision 1234

让我们了解当您将trunk合并到分支并分支回trunk时会发生什么:

当您将trunk合并到分支时,您正在进行三点合并。也就是说,您正在查看两个开发流的分支,主干和最近的共同祖先(MRCA)。您不仅要查看分支和主干上文件之间的差异,还要查看与最新共同祖先相比发生在主干上的更改。我不希望主干和分支匹配,我希望从MRCA到主干的更改被应用,并忽略从MRCA到该分支尖端的变化。

Subversion使用svn:mergeinfo来跟踪从主干中合并到您的分支中的内容。它可以使用它来确定您不再需要进入分支的更改。这样,您的分支机构可能已经更改了先前合并的内容,并且您不想从主干重新导入。

现在,让我们看看从分支合并回主干。如果我看着后备箱,我看到我的分支中没有任何东西被合并到后备箱中。毕竟,我刚刚进行了trunk->分支合并。如果我进行了标准合并,将考虑在我的分支上发生的所有更改。

这甚至包括我在trunk上做的更改,然后合并到我的分支。毕竟,Subversion没有真正了解这一点的方法。在主干上没有显示此合并的内容。

但是,我通常希望我的主干和分支在这一点上达成一致。 (假设我在重新整合之前从主干到分支进行了最终合并)。因此,您希望进行两点合并:您希望将分支版本与主干进行比较,并且在合并之后,主干上的版本应该与它在分支上的版本相同。

在旧版本的Subversion中,这就是--reintegrate参数的作用。它迫使Subversion使用两点合并而不是三点合并。但是,较新版本的Subversion现在可以自动了解何时进行重新集成合并。

那么,重新整合后分支的问题是什么?

  • Revsion 99 :您从主干到分支合并并提交更改。在你的分支上,“ svn:mergeinfo 表明,在修订版本99 上的所有内容都已合并到分支中。
  • 修订版100 :您将合并从主干提交到您的分支机构。
  • 修订版100 :仍然在修订版100中,您检查了主干。您希望从分支到主干进行重新整合合并。
  • 修订版100 :您现在进行重新整合合并。您在主干上看到svn:mergeinfo表示从主干到版本100的所有修订都已合并到您的主干中。
  • 修订版101 :您提交了主干合并。
  • 修订版102 :您进行了更改,并意识到这也应该放入您的分支机构。

现在,让您的分支机构上的结帐修订版102,并进行合并。那svn:mergeinfo说什么?它说从主干到版本99的所有修订都已合并到我的分支中。 Subversion会做什么?它希望将修订版100,101和102中的更改合并到您的分支中。

但等一下!修订版100没有发生在主干上。它发生在分支上。没关系。修订版102包括您在分支上所需的更改。但是,修订版101是您从分支机构返回到主干的合并。 Subversion将尝试合并我最初在我的分支上执行的所有更改,并合并到trunk 回到我的分支上!这不好。

怎么办?有两种解决方案:

  • 最简单的方法是删除分支并重新创建分支。毕竟,在你进行重新整合合并的时候,你的分支和主干应该是相同的。从理论上讲,这没有什么不妥。但是,您将失去分支机构的历史。

  • 您可以做的另一件事是让Subversion认为您已将修订版101中的更改​​合并到您的分支上,而不实际进行合并。您可以通过自己编辑svn:mergeinfo来完成此操作,但这可能有点容易出错。

更好的方法是在合并中使用--record-only选项:

$ svn co REPO/branch/1.2
$ cd 1.2
$ svn merge -r101 --record-only $REPO/trunk
$ svn commit -m"Rev 101 was my reintegration merge from 1.2->trunk"

一切都好。现在,当我尝试进行合并时,Subversion会将主干上的修订版102合并到我的分支中,而不是我的重新整合版本。

事实上,如果我在重新整合合并后立即进行--record-only合并,我本可以这样做:

$ cd 1.2
$ svn merge --record-only $REPO/trunk

那是因为所有其他修订 - 除了我的重新整合合并 - 已经在分支机构上了。我所做的就是更新svn:mergeinfo以包含来自主干的修订版101.

所以,对于你的第一个错误,它可能没问题。检查主干和你的分支是否同意。正如我所说的,Subversion的新版本明白,从分支到主干的合并应该是重新整合合并 - 即使你没有包含--reintegration参数。如果没有,你可能需要做更多工作来解决这个问题。

对于您的第二个错误,请从主干到分支进行--record-only合并以更新svn:mergeinfo。如果你不能,你可能需要手动munge svn:mergeinfo。使用svn propedit并不困难,您可以在您喜欢的编辑器中编辑该属性。 svn:mergeinfo的格式非常明显,因此添加额外的修订并不困难。

永远记住。这是版本控制。没有任何东西永久损坏。您始终可以返回到存储库的早期版本,然后重试。你得到的最糟糕的事情就是记录你的顽固方式永久铭刻在svn log

如果那是你生命中发生过的最糟糕的事情,那么你就会在这个多岩石的小星球上过着幸福的生活。