我有一个分支a1,其父分支为A。现在,我从同一父A创建了另一个分支a2。我想将a1与a2合并,但不包括a1中的chengeset。有没有办法部分合并不包含变更集的分支?
答案 0 :(得分:3)
简短的答案是“否”:根据图拓扑而不是分支名称来合并工作。
更长的答案仍然不是,但是值得绘制拓扑。您的描述谈论分支育儿,但是分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。 (提交具有父/子关系,或更普遍的是祖先/后代关系。)所以:
我有一个分支a1,其父分支为A。
这确实意味着您有一些提交a1
,并且其中一个或多个提交具有父提交
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一起提交; ,但实际上是图拓扑对其进行控制。)