【问题标题】:SVN Merge - Merging back to trunk when branch doesn't share common ancestrySVN Merge - 当分支不共享共同祖先时合并回主干
【发布时间】:2026-01-07 00:50:02
【问题描述】:

我需要将一个分支 branchA 合并回主干,该分支是错误地使用 svn mkdir 而不是 svn copy 创建的。

使用svn merge --ignore-ancestry ^/branches/branchA . 会导致很多树冲突,我只能通过svn resolve --accept working 解决,虽然我需要的是接受来自branchA 的更改。 我想这样做,因为branchAtrunk 的超集,并且没有任何与branchA 中的提交并行的主干提交。

有什么办法可以做到吗?

注意:
我无权运行svn-admin

【问题讨论】:

  • 在分支A中保存历史很重要吗?
  • @lrb:实际上是的,因为branchA 上的功能开发了一个月并且有几个提交。

标签: svn version-control merge


【解决方案1】:

简短的回答:你不能。你不能,因为 Subversion 通常使用所谓的三向合并。您需要两个端点(分支的 HEAD 和主干的 HEAD)加上 最近的共同祖先 (MRCA) 作为合并中的第三个点。

MRCA 用于确定分支上的更改以及主干上的更改。假设我们的文件最初看起来像这样:

one
two
three
four
five
six

在我们的后备箱上:

one
FOO
three
BAR
five
FUBAR

在我们拥有的分支上:

one
two
BARFOO
four
five
six

我们现在想将我们的分支与主干合并。如果我们简单地做一个比较,我们会看到第二行、你、第四行和第六行不同。然而,主干上的二四线和六线被改变了。我们不想更改它们以匹配分支上的内容。相反,分支上唯一更改的行是第 3 行。我们将第 3 行从分支替换到主干。没有触及其他线条。

现在,Subversion 合并比这复杂一点,但这是三路合并的基本算法:您将要合并的两个 HEAD 与它们的 MRCA 进行比较。没有 MRCA,您就无法合并 - 这就是您所处的情况。

即使--ignore-ancestory 标志也不起作用,因为您在主干上有foo.txt,在您的分支上有foo.txt。在您看来,它们可能看起来像同一个文件,但根据 Subversion,它们不是同一个文件。它们是两个完全不同的文件,只是碰巧位于同一个目录中并且具有相同的名称。

如果您想简单地强制您的主干看起来像您的分支,您可以尝试--accept theirs-full 标志。同样,我不能 100% 确定这会起作用,因为 Subversion 可能拒绝识别文件名。如果你没有安装 Subversion 1.8,你可以试试--reintegrate 选项。

最后,您可以尝试欺骗 Subversion。在主干的正确分支点创建另一个分支。看看那个新分支。使用系统的复制命令(而不是通过 Subversion)将文件从坏分支复制到这个新分支。现在,提交任何更改(您可能必须添加不存在的文件并删除应该不再存在的文件)。提交更改。

您应该有一个看起来与坏分支完全相同的新分支。但是,由于此分支具有 MRCA,您应该可以进行合并。

【讨论】: