0

使用 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

提前非常感谢。

4

2 回答 2

1

我认为这个问题是对hg diff -cakahg diff --change所做的事情的误解。它需要一个修订 ID,并向您显示该修订相对于其左父所做的更改。

你在打电话:

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

这会产生多个修订(它是一个修订集),但只有其中一个被使用。您实际上看到的是以下输出:

hg diff --change 120a0b8a0ede

如果您想要做的是将所有传出更改集中在一个您不想要的差异中--change/ -c

如果您考虑一下,revsetoutgoing()可能包含来自许多分支的许多变更集,因此根本不可能将它们全部整合到一个差异中。

如果您要获取的视图是“default本地分支上的最新头与default远程上的最新头相比如何”,您需要知道默认情况下最新头的节点 ID,然后在本地您会赶紧跑:

hg diff node_id_of_most_recent_head_on_default_at_remote_site
于 2013-11-14T14:27:42.947 回答
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
于 2013-11-16T11:31:39.670 回答