Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control 如何指定要在“hg合并”中使用的合并基_Version Control_Mercurial_Merge_Dvcs_Three Way Merge - Fatal编程技术网

Version control 如何指定要在“hg合并”中使用的合并基

Version control 如何指定要在“hg合并”中使用的合并基,version-control,mercurial,merge,dvcs,three-way-merge,Version Control,Mercurial,Merge,Dvcs,Three Way Merge,我正在尝试在一个复杂的hg存储库中进行复杂的合并。我对Mercurial选择用作执行合并基础的最新共享祖先不满意 我想指定一个我自己选择的特定提交作为基础 这可能吗?如果可能,怎么可能?你做不到。因为最新的共享祖先是合并的真正基础 如果您想执行合并,但不想重新思考,因为您的逻辑库显示/me/错误的假设和解决方案路径,您可以转到克隆重新基合并导出导入修补程序路径。基本路径仅用作合并工具的另一个输入。如果您在合并工具配置中禁用premerge,premerge会在没有冲突时为您做出明显的选择,并手动

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

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


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

你做不到。因为最新的共享祖先是合并的真正基础


如果您想执行合并,但不想重新思考,因为您的逻辑库显示/me/错误的假设和解决方案路径,您可以转到克隆重新基合并导出导入修补程序路径。基本路径仅用作合并工具的另一个输入。如果您在合并工具配置中禁用premerge,premerge会在没有冲突时为您做出明显的选择,并手动调用合并工具,提供您想要的3个版本(本地、远程和基础)的副本,您可以在合并工具中获得所需的任何内容。只有左父级和右父级实际记录在合并中。

Mercurial 3.0:您现在可以选择要用作合并基础的祖先。您可以通过设置merge.prefer祖先来实现这一点。当这有意义时,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)
Mercurial 3.0版之前的版本:Lazy Badger是正确的,当从命令行使用Mercurial时,您不能选择它选择的祖先。但是,您可以在内部完成此操作,为此编写扩展并不太困难:

来自mercurial导入扩展、命令、scmutil 从mercurial导入合并为mergemod 已保存的\u祖先=无 def updateorig、repo、节点、分支、强制、部分、祖先=无: 如果已保存,请执行以下操作: 祖先=scmulti.revsinglerepo,已保存的\u祖先.node 返回origrepo、node、branchmerge、force、partial、祖先 def mergeorig,ui,repo,node=None,**选项: 全局保存的\u祖先 保存的祖先=选择。获取“祖先” 返回origui、repo、node、**选项 def extsetupui: extensions.wrapfunctionmergemod,“更新”,更新 entry=extensions.wrapcommandcommands.table,“merge”,merge 条目[1]。追加“祖先”,“重写祖先”,“修订” 将其放入文件并加载扩展名。您现在可以使用

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-ANCENTOR 2,则会得到不同的结果:

a
b
c
b

在这两种情况下,我的KDiff3都能够自动处理合并而不报告任何冲突。如果我使用递归合并策略并选择e72ddea4d238作为祖先,那么我会遇到一个合理的冲突。Git默认使用递归合并策略。

可以有多个候选共享祖先,它们同样优秀,但不同。见@LucasMeijer-1。我们说的是Mercurial,不是Git 2。它们并不一样好,因为最新的祖先是好的。你有什么理由知道最新的总是最好的。依我看,没有办法知道这一点。尽管通常最新的是最好的。git链接只是说明了一种没有最佳方案的情况,这种情况在mercurial中也可能发生。1。Mercurial没有八达通合并2。两个发散的节点必须有共同的父节点,其中仍然没有发生分离3。最新的父对象是最好的,因为它不包含过多的块,不相关的可合并数据是的,我可以完全手动执行,对于每个合并冲突,手动复制粘贴到我想要的基对象中。不过,我正在研究20多个合并冲突,并且认为我们必须能够自动解决一些问题。真是太棒了!工作完美。非常感谢你。事实上,我不明白为什么Mercurial中没有包含此功能。在大多数情况下,您不需要它,但在必要的情况下,它可以节省解决冲突的时间,甚至可以防止错误的自动合并。在回购协议发生不准确的变化后,我刚刚遇到了这样的问题。