0

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

4

1 回答 1

0

该分支是如何创建的?它是通过 using 创建的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 分支上创建两个完全不同foo的。bar根据 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仅记录您进行合并的事实而无需实际执行合并。这可能会在您下次进行合并时有所帮助,因为您至少要重新编码您手动完成的内容。

于 2013-07-18T03:44:29.933 回答