【问题标题】:How to do subversion merge cherry picking without conflicts如何在没有冲突的情况下进行颠覆合并樱桃采摘
【发布时间】:2015-06-19 11:10:48
【问题描述】:

使用 svn 1.8,我不知道用cherrypicking 重新集成合并的最佳方法是什么(即我不想将所有修订合并回主干)。只要我合并所有修订,一切都会顺利进行,例如:

svn merge ^/branches/mybranch

现在我的分支中有一个不应该合并回主干的修订,假设我的 svn 'history' 是这样的:

rev 20: reintegrated branch => trunk
rev 21: added 'donotmergetotrunk.txt' to branch 'mybranch'
rev 22: added 'monkey.txt' to trunk
rev 23: added 'dog.txt' to branch 'mybranch'
rev 24: merged trunk => mybranch, monkey.txt added to branch

现在我想将除修订版 21 之外的所有内容从 mybranch 重新集成到主干,但无论我尝试什么,我都会遇到冲突

Tree conflict on 'monkey.txt'
    local file obstruction, incoming file add upon merge

我尝试过类似的东西:

svn merge -r 21:24 ^/branches/mybranch
svn merge -r 1:20 -r 21:24 ^/branches/mybranch

当然可以手动解决冲突,但在现实生活中我会遇到很多冲突,解决它们会变得非常乏味。

如何在不发生冲突的情况下执行此合并?

【问题讨论】:

    标签: svn


    【解决方案1】:

    在您的简单情况中,您必须合并-r 23:24

    在更常见的情况下,您可以在 SRC 中以 -rN:M 的形式使用最小需要的范围,并使用 变更集的反向合并排除此范围内不需要的修订-c -R

    【讨论】:

    • 非常感谢您的回答。 svn merge -r 23:24 只会将修订版 24(前向合并)合并回主干。这样做我得到了同样的树冲突。 svn merge -r 20:24 -c -21 也给出了树冲突。似乎每当我使用范围时,我都会遇到树冲突。使用 svn 1.8.13 顺便说一句。
    • 现在我注意到使用反向合并 svn merge -r 20:24 -c -21 实际上会产生正确的结果(在简单地将树冲突标记为已解决之后)。添加了 dog.txt,合并信息按预期包含 /branches/mybranch:3-19,22-24。虽然仍然无法解释树冲突......我不想大声说出来......也许是一个错误? :)
    【解决方案2】:

    当你将分支合并到主干时,你应该跳过之前从主干到分支的同步合并。

    否则,subversion 会尝试将它们合并回主干,这会产生冲突:

    monkey.txt 在 rev.22 中被添加到主干
    rev.22 作为 rev 包含在分支中。 24
    然后当您尝试将分支合并到主干时,Subversion 尝试将 rev.24 应用到主干并添加monkey.txt。但是已经添加了!冲突。

    您也可以尝试使用http://svnbook.red-bean.com/en/1.7/svn.branchmerge.advanced.html#svn.branchmerge.advanced.blockchanges 来阻止某些修订合并到主干中。但是在这种情况下,当您阻止所有不需要的修订并在主干上执行时

    svn merge ^/branches/mybranch
    

    Subversion 可以威胁重新整合合并(应用所有差异)。我不确定 Subversion 1.8 如何决定这是同步还是重新集成合并,最好玩一下。

    【讨论】:

    • AFAIK,跳过从主干到分支的同步合并是不明智的。假设您在同步合并中修复了一些“常规”冲突。如果在进行重新集成合并时跳过同步合并,svn 无法知道你已经解决了冲突,它会再次给你同样的冲突。请记住,如果您只是重新集成 svn merge ^/branches/mybranch 之类的所有内容,甚至包括同步合并,您都不会遇到任何奇怪的问题。我会阅读您提供的链接(希望他们发布更新的 1.8 版红皮书)。谢谢。
    • "请记住,如果您只是重新集成所有内容,例如 svn merge ^/branches/mybranch,就不会遇到任何奇怪的问题,甚至不会包括同步合并。"这是因为 subversion 1.8 猜测这应该是 'reintegrate' 合并(并且
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多