【问题标题】:Subclipse tree conflicts子剪辑树冲突
【发布时间】:2013-07-16 15:40:18
【问题描述】:

我正在尝试将主干合并到分支,但最终会出现很多树冲突,没有合并任何文件。为了解决冲突,我只是手动打开文件并复制内容,这违背了合并操作的目的。 将主干合并到分支的正确方法是什么(在子剪辑中)?

【问题讨论】:

    标签: eclipse svn version-control merge subclipse


    【解决方案1】:

    那个分支是如何创建的?它是使用svn cp 创建的,还是手动将这些文件复制到该分支中?

    让我们看看以下内容:

    $ svn mkdir trunk
    $ vi trunk/foo trunk/bar
    $ svn add trunk/foo trunk/bar
    $ svn commit -m"Added foo and bar to trunk"
    

    您现在在主干上有两个文件。

    $ svn mkdir --parents branches/1.0
    $ cp trunk/* branches/1.0/
    $ svn add branches/1.0/*
    $ svn commit -m"Duplicated files onto branch"
    

    我所做的是在 1.0 分支上创建两个完全不同的 foobar。根据 Subversion 的说法,这两个文件完全没有关系。如果您在 1.0 分支上进行更改,并尝试将这些更改合并回主干,您将与诸如“本地添加,传入添加”之类的消息发生很多冲突。

    以上用户应该做的是这样的:

    $ svn cp --parents trunk branches/1.0
    $ svn commit -m"Branched trunk and not merely duplicate files"
    

    现在,Subversion 可以理解主干上的文件和 1.0 分支上的文件之间的关系。合并会顺利进行。

    这是另一种打破合并的方法:

    $ svn delete trunk/foo
    $ svn commit -"deleted foo"
    $ svn cat -rPREV trunk/foo@PREV > foo
    $ svn add foo
    $ svn commit -m"Added foo back in. Shouldn't have deleted it.
    

    根据 Subversion,现在主干中有两个完全不同的文件,名为 foo。有你删除的文件,还有你添加的文件。这两个文件彼此无关。想象一下,如果我分支(使用svn cp 的正确方法)到1.0 分支,然后删除并复制foo。 1.0分支合并回主干会产生冲突,因为分支上的foo与主干上的foo没有关系。

    要恢复文件,您需要复制已删除的修订(或使用svn merge -c)。

    $ svn cp -rPREV http://svn.repo/svn/trunk/foo@PREV .
    $ svn commit -m"Actually old foo now has been restored! Merges will work"
    

    如果您错误地分支,或删除并重新添加文件回到主干,您将遇到冲突。您可以尝试使用--ignore-ancestory 参数,也可以在运行实际合并之前使用--dry-run 测试您的合并。

    如果您手动合并,您可以使用svn merge --record-only 仅记录您进行合并的事实,而无需实际执行合并。这可能会在您下次进行合并时有所帮助,因为您至少要重新编码您手动完成的内容。

    【讨论】:

    • 如果分支不是使用 svn cp 创建的,它的历史是否也会包含主干的历史?因为我可以在分支的历史记录中看到主干的日志。无论如何,现在我知道了避免合并错误的正确分支方式,感谢您的详细回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多