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

时间:2015-02-06 15:05:08

标签: mercurial

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

CVS存储库有几个分支,我们可以调用其中两个“main”和“feature”。很长一段时间以来,“功能”一直在“主要”分支。在分支之间,通常通过检查在一个分支中提交的更改到另一个分支来“合并”更改。经常标记“合并”修订,其中“主要”和“特征”相同。

当我尝试在Mercurial中进行第一次(真实)合并时,三向合并假定“基本”版本是“特征”最初分支时的修订版本。这意味着存在大量具有冲突的视觉集群,其中“主要”和“特征”几乎彼此相同但与“基础”版本非常不同。这非常糟糕,合并将花费很长时间,并且容易出错。

我想知道是否有办法告诉Mercurial基本版本是标记的“合并”版本之一,例如

hg up功能; hg merge main --base“tag-xyz”

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

1 个答案:

答案 0 :(得分:1)

我建议您修复近期的历史记录。这有些混乱,但一旦完成,Mercurial的合并应该可以正常使用。

首先,找到功能和主要分支完全相同的最新点。合并等效提交(将main合并到feature中)。这应该创建一个有两个父母的新头(一个来自特征,一个来自主要)。此外,该头应位于功能分支上,而不是主分支上。由于提交完全相同,因此您不应该遇到冲突。接下来,您需要将功能分支的其余部分重新绑定到此头部。

假设新头是提交abc。同样,这个头有两个父母,其中一个在功能分支上。该功能父级具有第二个子级,该子级也位于功能分支上。假设第二个孩子提交def。然后你可以按如下方式执行rebase:

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

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

完成此操作后,合并应该“正常工作。”