2013-07-17 53 views
0

我试图合并一个树干到一个分支,但结束了很多树冲突,没有任何文件合并。为了解决这些冲突,我只是打开文件并手工复制内容,这就违背了合并操作的目的。 将树干合并到分支(在subclipse中)的正确方法是什么?Subclipse树冲突

回答

0

那个分支是如何创建的?它是使用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" 

现在,有这么颠覆树干上的文件之间并在1.0分支理解的关系。合并将顺利进行。

这里的另一种方式,打破了合并:

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

据颠覆,现在有在后备箱命名foo两个完全不同的文件。有你删除的文件,还有你添加的文件。这两个文件没有任何关系。想象一下,如果我将分支(使用svn cp的正确方法)分支到1.0分支,那么我的删除和复制foo。由于分支上的foo与trunk上的foo没有任何关系,因此1.0分支与主干的合并将会产生冲突。

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

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

如果分支不正确或删除并将文件重新添加回主干,将会发生冲突。您可以尝试使用--ignore-ancestory参数,并且可以在运行实际合并之前使用--dry-run来测试您的合并。

如果您手动合并,则可以使用svn merge --record-only仅记录您进行合并而不实际执行合并的事实。这可能有助于您下次进行合并,因为您至少可以重新编码您手动完成的操作。

+0

如果分支不是使用svn cp创建的,它的历史是否也包含主干历史记录,直到这一点?因为我可以看到分支历史记录中的主干日志。无论如何,现在我知道正确的分支方式来避免合并错误,谢谢你的详细答案。 – Rnet