如何将一个分支与同一个父对象的其他分支合并,但不考虑单独更改集

时间:2019-01-06 16:53:28

标签: mercurial branch changeset hg-merge

我有一个分支a1,其父分支为A。现在,我从同一父A创建了另一个分支a2。我想将a1与a2合并,但不包括a1中的chengeset。有没有办法部分合并不包含变更集的分支?

1 个答案:

答案 0 :(得分:3)

简短的答案是“否”:根据图拓扑而不是分支名称来合并工作。

更长的答案仍然不是,但是值得绘制拓扑。您的描述谈论分支育儿,但是分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。 (提交具有父/子关系,或更普遍的是祖先/后代关系。)所以:

  

我有一个分支a1,其父分支为A。

这确实意味着您有一些提交,其分支名称为a1,并且其中一个或多个提交具有父提交A的号码。如果我们绘制它们,例如:

A:  ...--o--o--o
          \
a1:        o--o
  

现在,我从同一父A创建了另一个分支a2。

同样,这仅意味着您有更多的提交(带有其rev-number),其分支名称为a2;至少一个这样的提交有一个其分支名称为A的父级;我们可以用多种方法来绘制这种图形,但让我们尝试一下:

a2:              o--o
                /
A:  ...--o--o--o
          \
a1:        o--o
  

我想将a1与a2合并,但要排除a1中的chengeset。

您并没有真正合并分支。相反,您合并 commits 。您可以在将某些提交检入工作树的同时执行此操作(此工作树副本是建议的下一个提交),并且根据定义,您位于某个分支上。然后,您运行hg merge并指定其他修订:位于此分支或任何其他分支上的提交。假设合并有意义,Mercurial开始合并过程。合并完成后,新提交将把您当前的分支作为其分支,并将工作树的父提交作为其第一父分支,并将提供的修订版作为其第二父分支。

因此,在这里,您可以hg update a2选择a2的尖端作为复制到工作树中的提交。工作树是对a2的提议但尚未实际的新提交,其父树是现在标记为@的提交:

a2:              o--@
                /
A:  ...--o--o--o
          \
a1:        o--o
  

是否有一种方法可以部分合并不包含变更集的分支?

您可以选择a1上的两个提交(此处仅绘制了两个)之一作为hg merge操作的目标。假设您使用hg merge a1选择了 second 之一:

a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--●

实心圆是合并的提交; @是工作树的父级;因此*是他们的合并基础-最佳的共同祖先提交。 Mercurial会将*中快照的内容与@中快照的内容(或工作树-在启动过程中,这些内容应该相同)进行比较,并且还将其内容进行比较*中的快照到中的快照。这两个比较各自产生一个整体变更集:o之间*中的内容与中的内容进行了修改。合并将简单地合并这两个en-masse变更集(然后将其应用于基础内容)。

您当然可以选择其他a1提交进行合并,但是您将使用其快照,而不是的快照。这将有效地排除中的更改-可能不是您想要的。

让我们绘制第三张图,因为这个特定的图对于我们的目的来说有点浅。假设我们有很多,而不仅仅是两个a1独占的提交。但是其中一个 (在这里我们将其绘制为x),在合并到@时我们想排除:< / p>

a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--o--o--x--o--o--o   [want to merge this commit]

要实现您想要的目标,必须首先在a1或完全在新分支上进行 new 提交。这些新的提交将如下所示:

a2:              o--@
                /
A:  ...--*--o--o
          \
           o--o--o--x--o--o--o
a1:               \
                   ----o--o--o

在这种情况下,我将新提交作为新的迷你分支 a1绘制,但是将它们放在新分支{{1 }}:

a3
在两种情况下,

这三个 new 提交仅仅是在 提交a2: o--@ / A: ...--*--o--o \ a1: o--o--o--x--o--o--o \ a3: ----o--o--o 之后发生的变更集的副本。使用x时,制作这些副本的简单方法是使用a3。现在我们可以选择hg graft的尖端提交作为合并到a3中的那个:

a1

,合并的结果将是合并提交,这将绑定到旧的a2: o--@ / A: ...--*--o--o \ a1: o--o--o--x--o--o--o \ a3: ----o--o--● (新的合并是当前的提交,因此现在是@)和{{1 }}:

@

合并 still 使用拓扑,而不是分支名称。

(这是Mercurial的一个重要实现:分支名称仅是 group一起提交; ,但实际上是图拓扑对其进行控制。)