如何将一个分支与同一父级的其他分支合并,但在mercurial中仅排除变更集

如何将一个分支与同一父级的其他分支合并,但在mercurial中仅排除变更集,mercurial,branch,changeset,hg-merge,Mercurial,Branch,Changeset,Hg Merge,我有一个分支a1,它的父分支是a。现在我已经从同一个父分支a创建了另一个分支a2。我想将a1与a2合并,不包括a1中的chengeset。是否有一种方法可以部分合并不包括变更集的分支?简短的回答是否:合并根据图形拓扑而不是分支名称工作 较长的答案仍然是否定的,但值得绘制拓扑图。您的描述谈到分支的父级关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。(提交具有父/子关系,或者更一般地说,具有祖先/后代关系。)因此: 我有一个分支a1,它的父分支是a 这实际上意味着您有一

我有一个分支a1,它的父分支是a。现在我已经从同一个父分支a创建了另一个分支a2。我想将a1与a2合并,不包括a1中的chengeset。是否有一种方法可以部分合并不包括变更集的分支?

简短的回答是否:合并根据图形拓扑而不是分支名称工作

较长的答案仍然是否定的,但值得绘制拓扑图。您的描述谈到分支的父级关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。(提交具有父/子关系,或者更一般地说,具有祖先/后代关系。)因此:

我有一个分支a1,它的父分支是a

这实际上意味着您有一些提交,其分支名称为
a1
,其中一个或多个提交有父提交,其分支名称为
A
。如果我们绘制它们,我们会得到,例如:

A:  ...--o--o--o
          \
a1:        o--o
现在我已经从同一个父级A创建了另一个分支a2

同样,这意味着您还有更多的提交(及其版本号),其分支名称为
a2
;至少有一个这样的提交具有分支名称为
a
的父级;我们可以用很多种方法来画,但让我们试试这个:

a2:              o--o
                /
A:  ...--o--o--o
          \
a1:        o--o
我想将a1与a2合并,从a1中排除chengeset

您并没有真正合并分支。而是合并提交。这样做的同时,将一些提交签出到工作树中。此工作树副本是建议的下一个提交,根据定义,您位于某个分支上。然后运行
hgmerge
,并指定一些其他修订:在该分支或任何其他分支上的提交。假设合并有意义,Mercurial将开始合并过程。合并完成后,新提交将以当前分支作为其分支,并将工作树的父提交作为其第一个父级,提供的修订作为其第二个父级

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

a2:              o--@
                /
A:  ...--o--o--o
          \
a1:        o--o
a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--o--o--x--o--o--o   [want to merge this commit]
有没有办法部分合并不包括变更集的分支

您可以选择
a1
上的两个提交(我们这里只画了两个)中的任何一个作为
hg merge
操作的目标。假设您使用
hg merge a1
选择第二个:

a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--●
a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--o--o--x--o--o--o
                  \
a3:                ----o--o--●
填充的圆圈是提交合并
@
是工作树的父级;因此,
*
是它们的合并基础,也是最好的共同祖先提交。Mercurial会将
*
中的快照内容与
@
中的快照内容进行比较(或者启动流程时,这些内容的工作树应该相同),并且还会将
*
中的快照内容与
中的快照内容进行比较●。这两个比较分别产生一个整体变更集:
*
。Merge将简单地合并这两个整体变更集(然后应用于基础内容)

当然,您可以选择另一个
a1
commit进行合并,但是您将使用它的快照,而不是
。这将有效地排除
-可能不是您想要的

让我们再画第三张图,因为这张图对我们来说有点肤浅。假设不只是对
a1
独占的两个提交,而是有很多。但是其中一个,我们将在这里绘制为
x
,我们希望在合并到
@
时排除:

a2:              o--@
                /
A:  ...--o--o--o
          \
a1:        o--o
a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--o--o--x--o--o--o   [want to merge this commit]
要实现您想要的,您必须首先进行新的提交,可能是在
a1
上,也可能是在一个新的分支上。这些新提交将如下所示:

a2:              o--@
                /
A:  ...--*--o--o
          \
           o--o--o--x--o--o--o
a1:               \
                   ----o--o--o
在本例中,我将新提交绘制为
a1
中的一个新的小分支,但是在一个新分支
a3
上创建它们可能会更清楚:

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--●
a2:              o--@
                /
A:  ...--*--o--o
          \
a1:        o--o--o--x--o--o--o
                  \
a3:                ----o--o--●
合并的结果将是合并提交,它将绑定到旧的
@
-新合并是当前提交,因此现在是
@
-和

a2:              o--o---------------@
                /                  /
A:  ...--*--o--o                  /
          \                      /
a1:        o--o--o--x--o--o--o  /
                  \            /
a3:                ----o--o---●
合并仍然使用拓扑,而不是分支名称


(这是Mercurial的一个关键实现:分支名称只是组合提交;但真正控制事情的是图形拓扑。)

简短的回答是否:根据图形拓扑而不是分支名称合并工作

较长的答案仍然是否定的,但值得绘制拓扑图。您的描述谈到分支的父级关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。(提交具有父/子关系,或者更一般地说,具有祖先/后代关系。)因此:

我有一个分支a1,它的父分支是a

这实际上意味着您有一些提交,其分支名称为
a1
,其中一个或多个提交有父提交,其分支名称为
A
。如果我们绘制它们,我们会得到,例如:

A:  ...--o--o--o
          \
a1:        o--o
现在我已经从同一个父级A创建了另一个分支a2

同样,这意味着您还有更多的提交(及其版本号),其分支名称为
a2
;至少有一个这样的提交具有