合并方向在Mercurial中是否重要?

时间:2011-02-09 15:30:20

标签: mercurial merge dvcs

举个简单的例子:我正在使用默认分支,在本地提交一些更改集,然后从主存储库中提取了一些更改集。我已经在我孤立的本地存储库中工作了几天,所以在我将结果推回到master之前,需要进行很多更改才能合并。

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表示如此。)

2 个答案:

答案 0 :(得分:14)

他们(有效)相同。你会看到hg log --patch --rev X输出大小的差异,因为log显示结果的差异和(任意)它的'left'父级(官方p1),但这不是它的存储方式(Mercurial有一个二进制差异存储格式,它不是基于补丁/差异的)现在它是如何计算的(p1,p2和最近 - 共同 - 祖先都被使用)。

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

答案 1 :(得分:2)

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

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

如果将Rev 200合并到Rev 195中,书签my-stuff将继续转到Rev 201,因为您在具有书签的同一分支中生成新的变更集。

另一方面,如果将195合并为200,则会在分支中生成没有书签的变更集。 my-stuff书签将保留在Rev 195中。