如何在Mercurial中检查潜在的合并/ rebase冲突?

时间:2010-11-03 11:50:28

标签: mercurial

有没有一种简单的方法来检查合并/ rebase是否会产生文件冲突,而不实际执行合并/ rebase?

我希望能够决定是否:

  • 如果触摸的文件集(我和他们的)不同
  • ,则更改
  • 合并,如果我们一直在搞乱相同的文件。

由于错误的合并(由人为错误解决冲突导致的错误)更容易检测和反转,如果我做两个头的合并,而不是做了rebase。特别是如果我推动我的改变而后来意识到某些事情搞砸了。

(事先无法检查所有内容,因为我们没有完全全面的测试套件。)。

而且......我正在运行Windows。 :)

3 个答案:

答案 0 :(得分:11)

所以,在Martin的回答的帮助下,我想出了rebaseif扩展,它做了我想要的。

基本上,它尝试使用内部合并工具进行rebase,如果失败(它会对任何冲突造成),它会中止并与用户首选工具合并。

有关详细信息,请参阅https://bitbucket.org/marcusl/ml-hgext/src/tip/rebaseif.py

<强>更新

最近几个月,我又回到了合并,因为它本身就是安全的。由于依赖文件可能会影响更改,因此非冲突的rebase可能仍然存在问题。 (即,一个rebase在合并之前丢失了代码看起来的信息)。

作为rebaseif的作者,我建议使用普通的旧合并代替。 :)

答案 1 :(得分:4)

如果更改重叠,则没有理由使用hg mergehg rebase,否则hg rebase会在内部进行合并,并允许您使用与{{1}相同的工具解决此问题}。

至于测试合并或rebase是否会引起冲突,那么你可以使用

hg merge
在Mercurial 1.7中

覆盖您的正常merge tool configuration。 ($ hg merge --tool internal:merge 部分是新的,在早期版本的Mercurial中使用--tool internal:merge。)

合并后,

--config ui.merge=internal:merge

会告诉您结果,然后您将回到

开始的位置
$ hg resolve --list

答案 2 :(得分:3)

您可以看到两个变更集REV1和REV2是否影响任何相同的文件:

(hg status --change REV1 --no-status ; hg status --change REV2 --no-status) | sort | uniq --repeated

如果有任何输出,则在两个版本中都会触及相同的文件。

这很容易成为像以下的shell脚本:

#!/bin/sh
(hg status --change $1 --no-status ; hg status --change $2 --no-status) | sort | uniq --repeated

可以像以下任何一个一样运行:

./find_overlaps c8f7e56536ab d9e2268e20b9
./find_overlaps 1 33

如果你真的想要得到想象,你可以调整脚本以自动运行merge或rebase,具体取决于是否找到任何行。

如果你在窗户上,我的上帝会帮助你。 :)