Luc*_*jer 6 version-control merge mercurial dvcs three-way-merge
我正在尝试在复杂的hg存储库中进行复杂的合并.我对Mercurial选择用作执行合并的"基础"的"最新共享祖先"不满意.
我想指定一个我自己选择的特定提交作为基础.
这是可能的,如果是的话,怎么样?
Mar*_*ler 15
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)
Run Code Online (Sandbox Code Playgroud)
版本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'))
Run Code Online (Sandbox Code Playgroud)
将它放在一个文件中并加载扩展名.你现在可以使用了
hg merge --ancestor X
Run Code Online (Sandbox Code Playgroud)
覆盖正常的祖先.正如您所知,如果有几个可能的祖先,这确实有所作为.如果你有纵横交错合并,就会出现这种情况.您可以使用以下命令创建此类案例:
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
Run Code Online (Sandbox Code Playgroud)
该图如下所示:
@ changeset: 4:333411d2f751
|\
+---o changeset: 3:7d1f71140c74
| |/
| o changeset: 2:fdf4b78f5292
| |
o | changeset: 1:eb49ad46fd72
|/
o changeset: 0:e72ddea4d238
Run Code Online (Sandbox Code Playgroud)
如果你正常合并,你将变更集eb49ad46fd72作为祖先,文件x包含:
a
c
b
c
Run Code Online (Sandbox Code Playgroud)
如果您改为使用,hg merge --ancestor 2则会得到不同的结果:
a
b
c
b
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我的KDiff3都能够自动处理合并而不报告任何冲突.如果我使用"递归"合并策略并选择e72ddea4d238作为祖先,那么我会遇到明显的冲突.Git默认使用递归合并策略.