代码之家  ›  专栏  ›  技术社区  ›  Simon P Stevens

处理SVN分支重复合并的正确方法是什么?

  •  6
  • Simon P Stevens  · 技术社区  · 16 年前

    这里我们有一个SVN存储库,它有一个主干和一个分支,用于在新版本上开发。

    分支现在即将发布,所以我决定将分支重新集成到主干中。显然有一些冲突。包括很多来自主干中删除的文件的树冲突。

    我很高兴地解决了所有的冲突,并承担了责任。

    问题是,然后我们对分支做了一些较小的更改,所以我再次对分支进行了重新集成,并发生了所有相同的树冲突。解决这些问题不是问题,但有很多问题,需要一段时间来手动检查和解决它们,我不想每次进行更改和重新集成时都要经历相同的解决过程。我曾期望SVN认识到分支机构已经重新整合了一次,并且只从上次重新整合发生的那一点开始合并。

    当我打开修订图时,它显示主干和分支被拆分的点,但它不显示合并。应该吗?

    服务器:winserver2003(r2sp2)、visualsvnserver(1.7.2)。 客户机:windowsxp(sp3),我一直在使用tortoissesvn(1.6.5)来完成所有这些操作,但我也安装了命令行客户机。

    我通过确保主干是最新的,并使用Tortoissesvn进行合并来完成合并,当选项对话框出现时,我选择“重新集成分支”。我将合并深度设置为“工作副本”

    我处理这种情况是否不正确?我应该做些不同的事情吗?

    (也许我们的存储库布局错误。我们从主干中进行了分支,在分支中对新版本进行了所有的更改,现在该发布了,我们将把分支合并回主干中。也许这是错误的方法,我读过一些人用另一种方法来做,在主干中进行所有更改,并且只有当您几乎准备好发布并且分支成为支持的发布版本时才进行分支)

    3 回复  |  直到 10 年前
        1
  •  10
  •   sbi    16 年前

    以下是从 this chapter SVN手册:

    在Subversion1.5中,一旦从一个分支到另一个主干完成了--reintegrate合并,该分支就不能再用于进一步的工作。它不能正确地吸收新的主干变化,也不能正确地重新集成到主干。因此,如果您想继续处理您的特性分支,我们建议销毁它,然后从主干重新创建它。

        2
  •  1
  •   Tom Duckering Sorin Antohi    16 年前

    在这种情况下,在完成开发之前,我不会将代码从分支合并到主干。

    从主干合并到分支,以确保分支是最新的,并且对主干应用了任何修复。定期执行此活动以确保您的dev分支包含所有修复程序。然后在开发成为实时版本的时候,将分支到主干的合并作为一次性活动进行。

    我的回答做了一些假设,包括:

    • 你有活的后备箱和Dev 分支机构
    • 你只有一个活人 版本(即不维护传统 版本)

    希望有帮助。

        3
  •  1
  •   Johan Lundberg    10 年前

    现在实际上可以进行重复的双向合并

    一句小心的话。这个答案解释了该怎么做,但是如果你错过了任何一步,你会很抱歉的。例如,--reintegrate合并必须是完全微不足道的(分支中已经解决了所有差异),否则,当您继续在分支中工作时,您将默默地错过在--reintegrate合并步骤中所做的更改。另一种方法是在每次重新集成之后删除并重新创建分支。


    在至少1.6版和更高版本的SVN中,可以重复进行双向合并。您可以使用svn merge从“主”分支合并到子分支,只要您愿意,就可以多次合并,但每次将分支合并回“主”分支时,都必须提供选项

    --reintegrate 如其他答案所述。

    您还需要做的是告诉您的分支机构集成了它 在第二个手动步骤中(该分支已签出并更新),使用命令

    svn merge --record-only -c 391 ^/calc/trunk
    

    这里的391表示在calc/trunk中刚刚完成的--reintegrate分支提交中的合并提交编号。

    如果您错过了它,它可能仍然有效,或者您可能需要重新解决在下次合并时已经解决的合并冲突。只在记录步骤之后,您的分支就可以进行进一步的工作或合并了。 这很愚蠢(尤其是如果你被宠坏了 Git 像我一样,事情只是在工作),但如果你按照这个仪式来做,它就会工作,而且两个分支总是为新的承诺而开放。


    整个事情记录在SVN手册中 reintegrate twice

    这个合并使用cherry-picking合并语法 在被称为__CherryPicking__的部分。继续跑步 示例来自名为__的部分,重新整合分支__,其中 修订版X为修订版391:

    $ cd my-calc-branch $ svn update Updating '.': Updated to revision
    393. $ svn merge --record-only -c 391 ^/calc/trunk
    --- Recording mergeinfo for merge of r391 into '.':  U   . $ svn commit -m "Block revision 391 from being merged into my-calc-branch."
     Sending        .
    
     Committed revision 394.
    

    现在您的分支已经准备好再次吸收来自主干的更改。在分支与主干再次同步之后,您甚至可以再次重新整合分支。如果需要,您可以只合并另一个记录来保持分支的活动状态。冲洗并重复。