【问题标题】:Does merge direction matter in Mercurial?Mercurial中的合并方向重要吗?
【发布时间】:2011-06-24 05:35:51
【问题描述】:

举个简单的例子:我正在处理默认分支,在本地提交了一些变更集,并且我从主存储库中提取了更多。我已经在隔离的本地存储库中工作了几天,因此在将结果推送回主存储库之前需要合并很多更改。

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 建议这样做。)

【问题讨论】:

    标签: mercurial merge dvcs


    【解决方案1】:

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

    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 中。

    【讨论】:

    • 如果您使用Hg-Git,这一点尤其重要,因为它使用书签跟踪虚拟 Git 分支的位置。如果合并方式错误,Git 分支书签将不会移动,并且您将无法推送任何内容。
    • 将 200 合并到 195 并不能保证将书签向前移动到 201。如果你这样做 hg update my-stuff ; hg merge 200 它会,但如果你这样做 hg update 195 ; hg merge 200 它不会。按书签名称更新使其激活
    【解决方案2】:

    它们(实际上)是相同的。您会看到 hg log --patch --rev X 输出大小的差异,因为日志显示了结果的差异和(任意)其“左”父级(正式为 p1),但这不是它的存储方式(Mercurial 有一个二进制差异存储格式,即t patch/diff based),现在是计算方式(p1、p2 和 most-recent-common-ancestor 都被使用)。

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

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多