【问题标题】:SVN merging branch-trunk-branchSVN合并branch-trunk-branch
【发布时间】:2014-03-07 13:00:10
【问题描述】:

我做了一些愚蠢的事情。我已将主干合并到我的分支以进行同步并提交,然后将我的分支合并到没有 -reintegrate 选项的主干并提交。当然我的分支仍在开发过程中,我需要它,但我得到了

svn: E195016 ...Reintegrate 只能在修订 x 到 y 之前从“http://some.pl/trunk”合并到 reintegrate 源时使用,但情况并非如此 缺少范围...

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

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

【问题讨论】:

    标签: svn version-control merge


    【解决方案1】:

    只是这样做了吗?如果是这样,您可以使用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 现在会自动了解何时进行重新集成合并。

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

    • 修订版 99:您从主干合并到分支并提交更改。在您的分支上,`svn:mergeinfo 显示主干上直到 Revision 99 的所有内容都已合并到分支中。
    • 修订版 100:您将合并从主干提交到您的分支。
    • Revision 100:仍然是 Revision 100,您检查您的行李箱。您想要从分支到主干进行重新集成合并。
    • 修订版 100:您现在进行重新整合合并。您在主干上看到 svn:mergeinfo 表示从主干到修订版 100 的所有修订都已合并到您的主干中。
    • Revision 101:您提交了您的主干合并。
    • 修订版 102:您进行了更改并意识到这也应该放入您的分支中。

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

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

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

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

    • 您可以做的另一件事是让 Subversion 认为您已将 Revision 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。如果你不能,你可能不得不手动处理svn:mergeinfo。使用svn propedit 并不难,您可以在您喜欢的编辑器中编辑该属性。 svn:mergeinfo 的格式很明显,所以添加额外的修订版并不难。

    永远记住。这是版本控制。没有任何东西被永久损坏。您始终可以返回到存储库的早期版本,然后重试。你得到的最糟糕的事情是你的错误行为记录永久地刻在svn log 中。

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

    【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2013-04-14
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多