Svn 合并分支干线分支

Svn 合并分支干线分支,svn,version-control,merge,Svn,Version Control,Merge,我做了些蠢事。我已经将主干合并到我的分支中进行同步和提交,然后将我的分支合并到主干中而不使用-重新整合选项并提交。当然,我的分支仍在开发过程中,我需要它,但我得到了 svn:E195016…仅当x到y版本之前已从“”合并到重新整合源时,才能使用重新整合,但情况并非如此 缺少范围 不幸的是,主干从那个时候开始向前移动,所以我的分支不是最新的 修复它的最佳解决方案是什么?您刚才是这样做的吗?如果是这样,您可以使用svn merge取消合并更改。假设您在版本1234中将分支合并到主干: $ svn c

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

svn:E195016…仅当x到y版本之前已从“”合并到重新整合源时,才能使用重新整合,但情况并非如此 缺少范围

不幸的是,主干从那个时候开始向前移动,所以我的分支不是最新的

修复它的最佳解决方案是什么?

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

$ svn co $repo/trunk
$ cd $trunk
$ svn merge -c -1234 .   # Removes the merge that took place in revision 1234
让我们了解一下,当您将主干合并到分支并将分支重新合并到主干中时会发生什么:

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

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

现在,让我们看一下从分支合并回主干。若我看一下主干,我发现我的分支中并没有任何东西被合并到主干中。毕竟,我只是在做主干->分支合并。如果我进行了标准合并,则会考虑在我的分支上发生的所有更改

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

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

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

那么,在重新融入社会后,分支机构有什么问题

  • Revision 99:您从一个主干合并到另一个分支并提交更改。在您的分支上,`svn:mergeinfo显示主干上直到99版的所有内容都已合并到分支中
  • 修订版100:将合并从主干提交到分支
  • 修订版100:仍在修订版100上,您要检查您的行李箱。您想从分支合并到主干
  • 修订版100:您现在进行重新整合合并。您在主干上看到,
    svn:mergeinfo
    表示从主干到修订100的所有修订都已合并到主干中
  • 修订版101:提交主干合并
  • 修订版102:您进行了更改,并意识到这也应该放在您的分支中
现在,让我们在您的分支上签出修订版102,并进行合并。那上面说什么?它说从主干到99版的所有版本都已合并到我的分支中。颠覆将要做什么?它希望将修订版100、101和102中的更改合并到分支中

但是等一下!修订版100没有发生在主干上。这事发生在树枝上。没关系。修订版102包括您希望在分支上进行的更改。但是,修订版101是从分支到主干的合并。Subversion将尝试合并我最初在分支上所做的所有更改,并将这些更改合并到主干中,返回到分支上!这不好

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

  • 最简单的方法是删除分支并重新创建它。毕竟,在进行重新整合合并时,分支和主干应该是相同的。从理论上讲,这没什么错。但是,您将丢失分支的历史记录

  • 您可以做的另一件事是让Subversion认为您已经将修订版101中的更改合并到您的分支上,而没有实际进行合并。您可以自己编辑
    svn:mergeinfo
    来实现这一点,但这很容易出错

更好的方法是在合并中使用
--仅记录
选项:

$ 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合并到我的分支中,但不会合并我的修订版

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

$ cd 1.2
$ svn merge --record-only $REPO/trunk
这是因为除了我的重新整合合并之外,所有其他的修订都已经在分支上了。我所做的就是更新
svn:mergeinfo
以包含trunk中的修订版101

所以,对于你的第一个错误,它可能是好的。检查主干和分支在这一点上是否一致。正如我所说,较新版本的Subversion理解从分支到主干的合并应该是重新整合合并——即使没有包含
--replication
参数。如果没有,你可能还有更多的工作要做