gpt4 book ai didi

version-control - 如何指定要在 'hg merge'中使用的 merge 基础

转载 作者:行者123 更新时间:2023-12-04 13:24:18 26 4
gpt4 key购买 nike

我正在尝试在复杂的hg存储库中进行复杂的合并。我对Mercurial选择用作执行合并的“基础”的“最新共享祖先”不满意。

我想指定一个自己选择的特定提交用作基础。

这可能吗?如果可以,怎么办?

最佳答案

Mercurial 3.0:现在,您可以选择祖先用作合并基础。您可以通过设置merge.preferancestor来实现。当有意义时,Mercurial会告诉您有关情况。在下面的示例中,您将看到:

$ hg merge
note: using eb49ad46fd72 as ancestor of 333411d2f751 and 7d1f71140c74
alternatively, use --config merge.preferancestor=fdf4b78f5292
merging x
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

3.0版之前的 Mercurial: Lazy Badger是正确的,您不能从命令行使用Mercurial拾取的祖先。但是,您可以在内部进行此操作,为此编写扩展不是很困难:

from mercurial import extensions, commands, scmutil
from mercurial import merge as mergemod

saved_ancestor = None

def update(orig, repo, node, branchmerge, force, partial, ancestor=None):
if saved_ancestor:
ancestor = scmutil.revsingle(repo, saved_ancestor).node()
return orig(repo, node, branchmerge, force, partial, ancestor)

def merge(orig, ui, repo, node=None, **opts):
global saved_ancestor
saved_ancestor = opts.get('ancestor')
return orig(ui, repo, node, **opts)

def extsetup(ui):
extensions.wrapfunction(mergemod, 'update', update)
entry = extensions.wrapcommand(commands.table, 'merge', merge)
entry[1].append(('', 'ancestor', '', 'override ancestor', 'REV'))

将其放在文件中并加载扩展名。您现在可以使用
hg merge --ancestor X

覆盖正常祖先。如您所知,如果有多个祖先,此 确实会改变。如果您有纵横交错的合并,则会出现这种情况。您可以使用以下命令创建这种情况:
hg init; echo a > x; hg commit -A -m a x
hg update 0; echo b >> x; hg commit -m b
hg update 0; echo c >> x; hg commit -m c
hg update 1; hg merge --tool internal:local 2; echo c >> x; hg commit -m bc
hg update 2; hg merge --tool internal:local 1; echo b >> x; hg commit -m cb

该图如下所示:
@    changeset: 4:333411d2f751
|\
+---o changeset: 3:7d1f71140c74
| |/
| o changeset: 2:fdf4b78f5292
| |
o | changeset: 1:eb49ad46fd72
|/
o changeset: 0:e72ddea4d238

如果正常合并,则将更改集 eb49ad46fd72作为祖先,并且文件 x包含:
a
c
b
c

如果改用 hg merge --ancestor 2,则会得到不同的结果:
a
b
c
b

在这两种情况下,我的KDiff3都能自动处理合并,而无需报告任何冲突。如果我使用“递归”合并策略并选择 e72ddea4d238作为祖先,那么我将面临明智的冲突。 Git默认使用递归合并策略。

关于version-control - 如何指定要在 'hg merge'中使用的 merge 基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9350005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com