当使用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
提前多多感谢。
答案 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