【发布时间】:2019-06-01 11:51:25
【问题描述】:
我有一个分支 a1,其父分支是 A。现在我从同一个父分支 A 创建了另一个分支 a2。我想将 a1 与 a2 合并,不包括 a1 中的 chengeset。有没有办法部分合并不包括变更集的分支?
【问题讨论】:
标签: mercurial branch changeset hg-merge
我有一个分支 a1,其父分支是 A。现在我从同一个父分支 A 创建了另一个分支 a2。我想将 a1 与 a2 合并,不包括 a1 中的 chengeset。有没有办法部分合并不包括变更集的分支?
【问题讨论】:
标签: mercurial branch changeset hg-merge
简短的回答是否定的:合并工作根据图拓扑,而不是分支名称。
更长的答案仍然是否定的,但值得绘制拓扑。您的描述谈到了分支的亲子关系,但分支本身没有父/子关系。分支只是提交的集合,每个提交都包含其分支名称。 (提交有父/子,或更一般地说,祖先/后代,关系。)所以:
我有一个分支 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。
您并没有真正合并分支。相反,您合并提交。你这样做的同时将一些提交检出到工作树中——这个工作树副本是提议的下一个提交——根据定义,你在某个分支上。然后运行hg merge 并指定一些其他修订:在此或任何其他分支上的提交。假设合并有意义,Mercurial 将开始合并过程。合并完成后,新提交将以您当前的分支作为其分支,并将工作树的父提交作为其第一个父提交,并将提供的修订作为其第二父提交。
所以在这里,您可以hg update a2 选择a2 的提示作为复制到工作树中的提交。工作树是 a2 的提议但尚未实际的新提交,其父级是现在标记为 @ 的提交:
a2: o--@
/
A: ...--o--o--o
\
a1: o--o
有没有办法部分合并不包括变更集的分支?
您可以选择a1 上的两个(我们在这里只画了两个)提交中的任何一个作为hg merge 操作的目标。假设您选择了第二个,使用hg merge a1:
a2: o--@
/
A: ...--*--o--o
\
a1: o--●
填充的圆圈是要合并的提交; @ 是工作树的父级;所以* 是他们的合并基础——最好的共同祖先提交。 Mercurial 会将* 中的快照内容与@ 中的快照内容(或工作树——启动进程时这些内容应该相同)进行比较,并比较* 给● 中的那些人。这两个比较每个都会产生一个整体变更集:● 中的内容是根据* 和● 之间的o 中的内容修改的。 Merge 将简单地组合这两个整体变更集(然后将其应用于基础内容)。
当然,您可以选择另一个a1 提交进行合并,但是您将使用它的快照,而不是● 的快照。这将有效地排除 ● 中的更改——可能不是您想要的。
让我们再画第三张图,因为对于我们的目的来说,这张图有点浅。假设不仅仅是a1 独有的两个提交,我们还有很多。但是其中一个,我们将在这里绘制为x,我们希望在合并到@时排除:
a2: o--@
/
A: ...--*--o--o
\
a1: o--o--o--x--o--o--o [want to merge this commit]
为了实现你做想要的,你必须首先new提交,也许在a1,也许完全在一个新的分支上。这些新提交将如下所示:
a2: o--@
/
A: ...--*--o--o
\
o--o--o--x--o--o--o
a1: \
----o--o--o
在这种情况下,我将新提交绘制为一个新的迷你分支 within 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--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 的一个关键实现:分支名称只是组一起提交; 但真正控制事物的是 图拓扑。)
【讨论】: