如何在没有合并的情况下显示传出差异?

时间:2013-11-14 10:28:42

标签: mercurial

当使用mercurial时,在进行大量更改时,我会做几次提交(作为安全点,或与同事分享我的进度)。 我完成后,我想将我的更改推送到主存储库。不过,在我这样做之前,我会想做一个“hg pull -u&& hg merge”来获取自上次拉动以来发生的变化,并检查我的更改。

因为我有几个变更集,所以在每个变更集上运行hg diff都不是一个好的解决方案。

我尝试运行hg diff -c“outgoing()而不是merge()”只显示我的传出更改集的差异(没有合并的,因为这往往只会添加我想避免的噪音)。

然而,它仍然不适合我,因为mercurial似乎跳过一些信息,我不明白在什么基础上。请参考以下方案:

完整情景:

# clean working directory
rm -fr base clone
#prepare reference repo
mkdir base; cd base
hg init
touch 1.txt
echo " 1\n2" >>1.txt 
hg add 1.txt

touch 2.txt
hg add 2.txt

hg commit -m"initial commit"

cd ..
hg clone base clone
cd base
#update ref repo.
echo "foo" >> 1.txt
hg commit -m"update file on remote repository"

#make changes locally
cd ../clone
echo "foo" >> 2.txt
hg commit -m "update initial file"

#now we are ready to push
hg pull -u && hg merge
hg commit -m"merge"

#actually...
sed -i -e 's/foo/bar/' 2.txt        
hg commit -m"changed my mind"
hg out

changeset:   1:fce14ac089b2
date:        Thu Nov 14 11:17:08 2013 +0100
summary:     update initial file

changeset:   3:1967c50242c0
parent:      1:fce14ac089b2
parent:      2:2cdaf75afc6d
date:        Thu Nov 14 11:17:10 2013 +0100
summary:     merge

changeset:   4:120a0b8a0ede
tag:         tip
date:        Thu Nov 14 11:18:54 2013 +0100
summary:     changed my mind

#try to display my changes
hg diff -c"outgoing() and not merge()"     
--- a/2.txt Thu Nov 14 11:17:10 2013 +0100
+++ b/2.txt Thu Nov 14 11:18:54 2013 +0100
@@ -1,1 +1,1 @@
-foo
+bar

#only one change here!
#but 
 hg log -r"outgoing() and not merge()" 
 changeset:   1:fce14ac089b2
date:        Thu Nov 14 11:17:08 2013 +0100
summary:     update initial file

changeset:   4:120a0b8a0ede
tag:         tip
date:        Thu Nov 14 11:18:54 2013 +0100
summary:     changed my mind
#is ok

那么,有人可以向我解释为什么mercurial会完全改变fce14ac089b2吗?我期望的是合并输出,即:

--- a/2.txt
+++ b/2.txt
@@ -1,1 +1,1 @@
+bar

提前多多感谢。

2 个答案:

答案 0 :(得分:1)

我认为问题是对hg diff -c又名hg diff --change的误解。它需要一个修订版ID,并显示该修订版相对于其左侧父版本所做的更改。

你在打电话:

hg diff -c"outgoing() and not merge()"

产生多个修订版(它是修订版集),但只使用一个。你基本上看到了输出:

hg diff --change 120a0b8a0ede

如果您要执行的操作是将所有外向更改集中在一个差异中,则您不希望--change / -c

如果您考虑一下,revset outgoing()可能包含许多分支的许多变更集,因此将它们全部变为一个差异并不一定是可能的。

如果你想要获得的视图是“分支机构default上的最新负责人如何在远程default上与最近的负责人进行比较”,则需要知道节点ID默认情况下最近的头部,然后在本地运行:

hg diff node_id_of_most_recent_head_on_default_at_remote_site

答案 1 :(得分:0)

这不能保证,因为我希望有一些方法可以获得一个更改图表,其中最后一个公共祖先不是您所追求的变更集,但是......

> hg diff -r "last(ancestors(.) and public())"
diff -r 5579be654db4 2.txt
--- a/2.txt Sat Nov 16 11:03:06 2013 +0000
+++ b/2.txt Sat Nov 16 11:29:34 2013 +0000
@@ -0,0 +1,1 @@
+bar