Mercurial - 查看需要手动合并的文件列表?

时间:2011-01-28 18:59:35

标签: mercurial

在执行hg pull时,您是否可以在hg merge之后使用Mercurial命令查看需要手动合并的所有文件的列表(即:有冲突)? / p>

4 个答案:

答案 0 :(得分:35)

hg resolve --list

来自documentation

  

未解决冲突的合并通常是使用internal:merge配置设置或diff3等命令行合并工具进行非交互式合并的结果。 resolve命令用于管理合并中的文件,运行hg merge之后,以及运行hg commit之前(即工作目录必须有两个父级)。

编辑2012年1月5日:

(今天我收到了对这个答案的投票,所以我重新审视了它。我发现我误解了这个问题。)

问题是“我已经从远程存储库执行了拉动,还没有执行合并。我可以看到在执行合并时会产生什么冲突吗?”

我上面的答案显然是错误的。阅读完链接文档后,我认为没有内置的方法可以做到这一点。但是,有一种方法可以在不破坏您的工作源树的情况下完成它。

假设您已从本地系统的某个远程源克隆到 B 的存储库 A ,即hg clone http://hg.example.com/A B。执行此操作后,您将对本地存储库 B 进行更改,这些更改涉及至少一次提交。与此同时,已对存储库 A 进行了更改,因此当您执行拉动时,您会收到一条消息,指示已添加新的更改集并已创建头部。

此时,您可以hg heads列出合并中涉及的两个变更集。根据此信息,您可以发出状态命令以列出磁头之间的差异。假设您的存储库中的修订号 B ,根据头列表,是“1”和“2”,那么您可以hg status --rev 1:2查看更改列表。

当然,这并不能告诉您合并时是否会发生冲突。由于没有可以向您显示此命令的命令,因此您必须通过克隆到新存储库并在那里进行合并来“预览”合并。所以,hg clone B C && cd C && hg merge。如果您对此合并的结果感到满意,可以hg com -m 'Merging complete' && hg push && cd ../ && rm -rf C

这是一个过程,但如果合并结果是一场灾难,它会使您当前的源树保持清洁。您可能还会发现this description使用公共存储库很有帮助。

答案 1 :(得分:5)

除非我自己误读,否则上面的答案似乎并没有解决我认为被问到的问题:我在我的存储库中有两个分支,我想要合并,我想知道会发生什么样的冲突(例如,在逐步解决冲突决议之前。)

为此,我将与:merge3工具合并(尝试自动合并,但保留未解决的冲突),然后使用hg resolve --list - 或者只看一下merge命令的输出 - 来看看冲突。

hg merge <otherbranch> --tool :merge3
hg resolve -l

如果你最终没想要合并(如果你只想查看会发生什么冲突),那么之后可以运行hg update -C来撤消合并。

如果您确实想要完成合并,则可以在hg resolve <filepath>合并变更集之前为每个文件运行hg resolve --all,或者仅hg commit逐步执行所有仍存在冲突的文件

答案 2 :(得分:1)

您可以使用 hg stat - rev 选项和一对修订版来查看两者之间存在哪些文件差异。请参阅下面的略微详细但详细的示例:

首先,我们首先建立一个新的存储库:

[gkeramidas /tmp]$ hg init foo
[gkeramidas /tmp]$ cd foo

然后将名为foo.txt的单个文件添加到新存储库:

[gkeramidas /tmp/foo]$ echo foo > foo.txt
[gkeramidas /tmp/foo]$ hg commit -Am 'add foo'
adding foo.txt
[gkeramidas /tmp/foo]$ hg glog
@  0[tip]   b7ac7bd864b7   2011-01-30 18:11 -0800   gkeramidas
     add foo

现在添加第二个文件,名为bar.txt作为修订版1:

[gkeramidas /tmp/foo]$ echo bar > bar.txt
[gkeramidas /tmp/foo]$ hg commit -Am 'add bar'
adding bar.txt

返回修订版0,并在另一个上添加第三个文件。这样做是为了模拟其初始版本克隆了相同存储库的其他人的 pull

[gkeramidas /tmp/foo]$ hg up -C 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
[gkeramidas /tmp/foo]$ echo koko > koko.txt
[gkeramidas /tmp/foo]$ hg commit -Am 'add koko'
adding koko.txt
created new head
[gkeramidas /tmp/foo]$ hg glog
@  2[tip]:0   e5d80abdcb06   2011-01-30 18:12 -0800   gkeramidas
|    add koko
|
| o  1   a2d0d0e66ce4   2011-01-30 18:12 -0800   gkeramidas
|/     add bar
|
o  0   b7ac7bd864b7   2011-01-30 18:11 -0800   gkeramidas
     add foo

现在,您可以使用 hg stat 查看任何修订对之间存在哪些文件差异,例如:从rev 0到rev 1的更改将“bar.txt”添加到文件列表中:

[gkeramidas /tmp/foo]$ hg stat --rev 0:1
A bar.txt

从rev 0到rev2的更改将'koko.txt'添加到文件列表中:

[gkeramidas /tmp/foo]$ hg stat --rev 0:2
A koko.txt

但更有趣的是,从rev 1到rev 2的更改涉及两个文件清单更改。 (1)'koko.txt'在rev 2中添加,(2)'bar.txt'存在于rev 1中,但在rev 2中缺失,因此它显示为“已删除”文件:

[gkeramidas /tmp/foo]$ hg stat --rev 1:2
A koko.txt
R bar.txt

答案 3 :(得分:-1)

我认为hg status正是您所寻找的。

您可能希望从Mercurial:The Definitive Guide

中阅读本章

http://hgbook.red-bean.com/read/mercurial-in-daily-use.html