有没有办法在与 Mercurial 合并时设置自定义基础版本?

Is there a way to set a custom base version when merging with Mercurial?

我遇到了一个最初是 CVS 存储库的 Mercurial 存储库。它最近已通过 cvs2hg 迁移到 Mercurial。

CVS 存储库有几个分支,我们称其中两个为 "main" 和 "feature"。 "feature" 很久以前就从 "main" 分支出来了。在分支之间,更改经常 "merged" 通过将一个分支中提交的更改签入到另一个分支中。经常有标记 "merge" 的修订,其中 "main" 和 "feature" 相等。

当我尝试在 Mercurial 中进行第一次(真正的)合并时,三向合并假定 "base" 版本是 "feature" 最初分支时的修订版。这意味着有很多视觉集群存在冲突,其中 "main" 和 "feature" 几乎彼此等效,但与 "base" 版本非常不同。这太糟糕了,合并将花费很长时间并且容易出错。

我想知道是否有办法告诉 Mercurial 基本版本是标记的 "merge" 修订版之一,例如

hg up 功能; hg merge main --base "tag-xyz"

在这种情况下,合并会很容易。

我建议修复您最近的历史记录。这有点混乱,但一旦完成,Mercurial 的合并应该开箱即用。

首先,找到特征和主要分支完全相同的最近点。合并等效的提交(将 main 合并到 feature 中)。这应该创建一个包含两个 parent 的新头部(一个来自功能,一个来自主)。此外,该负责人应该在功能分支上,而不是主分支上。由于提交完全相同,因此您不应该遇到冲突。接下来,您需要将其余功能分支变基到这个头上。

假设新头是提交 abc。同样,这个 head 有两个 parent,其中一个在 feature 分支上。该功能 parent 有第二个 child,它也在功能分支上。假设第二个 child 是提交 def。然后你可以按如下方式执行变基:

hg phase -f -d 'def::'  # Unnecessary if you've never pushed
hg rebase -s def -d abc

这将更改 def 及其所有后代的提交编号 。如果您有存储库的多个实例,它们将需要进行相同的修复,或者您需要 re-clone 它们。否则,当人们推拉时,您的存储库会变得非常混乱。

完成此操作后,合并应该 "just work."