当使用合并在存储库中移动更改时,所有关于您拥有更改的位置的最新共同祖先以及您想要它的位置。如果在进行此修复之前,您的 repo 看起来像这样:
[a]-[b]-[c]-[d]
如果 1.0 标记的变更集是 [b],那么您现在有了这个:
[a]-[b]-[c]-[d]
\
-[e]
修复在[e] 中。 如果是这种情况,那么您只需要这样做:
hg update d
hg merge e
hg commit
然后你会得到这个:
[a]-[b]-[c]-[d]-[f]
\ /
-[e]-----
另一方面在进行更改之前,您的 repo 看起来像这样:
[a]-[b]-[c]-[d]
\
-[e]-[f]
1.0 抹布指向[f],那么你现在有了这个:
[a]-[b]-[c]-[d]
\
-[e]-[f]-[g]
在[g] 中进行了修复。如果您想将变更集 [g] 移动到 [d] 而不带上 [e] 和 [f],那么没有好的方法可以做到这一点。您可以使用的不太好的方法(称为cherrypicking)是使用hg export 和hg import 命令。
没有任何工作流程需要采摘樱桃,但要避免它需要一点深谋远虑。在第二种情况下,您可以通过不在 1.0 系列(作为[f] 的子代)上进行修复来避免它,而是作为您想要更改的两个地方的最近共同祖先的子代。由于您希望在 [d] 和 [f] 中都进行更改,因此您可以查找它们最近的共同祖先并看到它是 [b] 并使用以下命令进行更改:
hg update b
..edit..
hg commit
留下这张图:
[a]-[b]-[c]-[d]
\
\--[g]
\
-[e]-[f]
此修复,[g] 是一个新头,您可以将其合并到 [d] (2.0) 和 [f] (1.0) 中,而无需任何樱桃采摘。相应的命令是:
hg update d
hg merge g
hg commit
hg update f
hg merge g
hg commit
结果图是:
[a]-[b]-[c]-[d]--[h]
\ /
\--[g]----
\ \
-[e]-[f]-[i]
[h] 是您的新 2.0 修复,[i] 是您的新 1.0 修复。
总结:深思熟虑总是可以避免摘樱桃,但如果你不这样做,这不是世界末日