这里有很多场景您可能想要这样做,我会将每个场景都作为标题,以便您找到适合您的场景的场景。请注意,我仍在学习 Mercurial,如果我说的有误、使用了错误的术语、可以做得更好等,我希望得到指点。
没有进一步的变化,合并不共享(没有推/拉)
程序员已经合并,但没有做任何其他事情,也没有以任何方式与任何人分享更改
在这种情况下,只需丢弃本地克隆,然后从安全存储库中获取新的克隆。
合并之上的本地更改,不共享
程序员已合并,并基于该合并继续工作。应保留合并后的变更集,但应删除合并本身。更改(合并 + 以下更改集)尚未与任何人共享
在这种情况下,我会选择以下四种方法之一:
- 尝试使用 REBASE 扩展,这会将变更集从一个位置移动到另一个位置。如果变更集基于合并时引入的代码变更,则必须进行一些手动工作来协调差异。
- 尝试使用 MQ 扩展将要保留的变更集拉入补丁队列,然后将它们推回不同的位置。但是,在基于合并的更改方面,这将与 REBASE 扩展存在相同的问题
- 尝试使用 TRANSPLANT 扩展将更改从一个位置“复制”到另一个位置。尽管如此,前两个问题仍然存在。
- 重新做这项工作,可能在差异工具的帮助下对我要丢弃的变更集中进行更改,然后在正确的位置重新进行。
要摆脱合并变更集 + 以下所有变更集,有几个选项:
-
在 MQ 扩展中使用 strip 命令
hg strip <hash of merge changeset>
-
克隆和拉取,并指定导致合并的变更集的哈希,但不包括合并。本质上,通过从损坏的克隆中拉取新的克隆来创建新的克隆,并避免拉入您不想要的合并。
hg clone damaged -r <hash of first parent> .
hg pull damaged -r <hash of second parent>
合并推送给其他人,控制克隆
程序员已推送到主存储库,或其他人,或从程序员存储库中拉出的人。但是,您(作为开发人员组)可以控制所有存储库,例如,在完成更多工作之前,您可以联系并与每个人交谈
在这种情况下,我会看看是否可以完成第 1 步或第 2 步,但可能需要在很多地方完成,所以这可能涉及很多工作。
如果没有人根据合并变更集完成工作,我会使用第 1 步或第 2 步进行清理,然后推送到主存储库,并要求所有人从主存储库获取新的克隆。
合并推送,你无法控制克隆
程序员推送了mergeset,而你不知道谁将拥有merge changeset。换句话说,如果您成功地将其从您的存储库中根除,那么仍然拥有它的人的误推会将其带回来。
忽略合并变更集并在两个分支中工作,就好像它从未发生过一样。这将留下一个悬空的头。稍后,当您合并两个分支时,您可以对这个头进行空合并以摆脱它。
M <-- this is the one you want to disregard
/ \
* *
| |
* *
| |
只需继续在两个分支中工作:
| |
* *
| M | <-- this is the one you want to disregard
|/ \|
* *
| |
* *
| |
然后你合并两者,你想要的真正合并:
m
/ \
* *
| |
* *
| M | <-- this is the one you want to disregard
|/ \|
* *
| |
* *
| |
然后您可以进行空合并以摆脱悬空的头部。不幸的是,除了通过 TortoiseHg 之外,我不知道该怎么做。它有一个复选框,我可以在其中丢弃来自其中一个分支的更改。
使用 TortoiseHg,我会更新到我想要保留的合并(最上面,小写的 m),然后选择并右键单击下面悬空的合并头,然后选中“放弃合并目标中的所有更改(其他) 修订”: