2011-02-09 40 views
16

举一个简单的例子:我在默认分支上工作,在本地提交了一些变更集,并且我从主存储库中提取了一些变更集。我已经在隔离的本地存储库中工作了几天,因此在将我的结果推送回主服务器之前,需要进行一些合并更改。在Mercurial中合并方向问题吗?

default ---o-o-o-o-o-o-o-o-o-o-o (pulled stuff) 
      \ 
      o----o------------o (my stuff) 

我现在可以做两件事。

选项#1:

hg pull 
hg merge 

结果#1:

default ---o-o-o-o-o-o-o-o-o-o-o 
      \     \ 
      o----o------------o-O 

选项#2:

hg pull 
hg update 
hg merge 

结果#2:

default ---o-o-o-o-o-o-o-o-o-o-o-O 
      \     /
      o----o------------o 

这两个结果看起来同构于我,但在实践中,似乎选项#2导致较小的变更集(因为它只对主线应用我的少量更改,而不是将所有主线更改应用于我的几个)。

我的问题是:这有什么关系吗?我应该关心我合并的方向吗?如果我这样做,我可以节省空间吗? (合并之后做hg log --patch --rev tip建议如此。)

回答

14

它们(有效)是相同的。您看到hg log --patch --rev X输出大小有所不同,因为日志显示结果和(任意)其“左”父级(正式为p1)的差异,但这不是它的存储方式(Mercurial具有不是补丁的二进制比较存储格式/差异为基础),现在它是如何计算的(p1,p2和最近最常见的祖先都被使用)。

唯一真正的区别是,如果您使用的是命名分支,分支名称将是左父分支的名称。

2

如果您正在使用书签,也有区别。在进行合并时,您所在的分支是接收更改的分支,因此新的更改集将成为该分支的一部分。 Supose你有这样的情况:

default ---o-o-o-o-o-o-o-o-o-o-o -- Head: Rev 200 
      \ 
      o----o------------o -- Head: Rev 195, Bookmark: my-stuff 

如果合并修订版200到195版本,书签my-stuff将移动到启201,因为你是在生成具有书签同一分支新的变更。

另一方面,如果您将195合并到200中,您正在分支中生成没有书签的变更集。该my-stuff书签将保持在启195

+1

如果你正在使用[汞的Git(http://hg-git.github.com/)这一点尤为重要,因为跟踪虚拟的Git分支的位置使用书签。如果你以错误的方式合并,Git分支书签不会移动,并且你无法推送任何东西。 – 2012-04-23 16:55:08