我有一个 mercurial 存储库。它在修订版 A 上。我做了一些更改,提交(到修订版 B)并推送。然而,后来,我意识到我不想做出这些改变。我更新回版本 A,并对版本 C 进行了一些替代更改。
C
| -
| B
|/
A
但是,现在我无法推送 rev C,因为它抱怨它会创建一个新的远程头(它会)。如何让远程 mercurial 简单地忘记 rev B 和其中的所有更改,以便我可以推送 rev C 并从那里继续?
编辑历史很难。一旦将变更集推送到公共存储库,就不能再轻易地从历史记录中删除它。
解决您的问题的最直接方法是:
hg update <tip of branch you want to forget>
hg commit --close-branch -m "close unwanted branch"
hg update <tip of branch you want to keep>
--force
因为分支上现在存在多个头。如果您确实需要修剪分支,请再次阅读EditingHistory。如果看起来仍然可行,您可以使用PruningDeadBranches中描述的方法之一。
就我个人而言,我会关闭分支并强制推送(正如 Tim Henigan 所描述的那样),因为它使 DAG 处于真实状态。不过还有另一种选择。做一个虚拟合并。这是一个合并,但是您忽略了传入的更改。
hg update C
hg -y merge --tool=internal:fail B
hg revert --all --rev .
hg resolve -a -m
hg ci
最终结果是
M
|\
C |
| |
| B
|/
A
...但 M 不包含 B 的任何更改。
使用backout
命令反转 B 更改。
hg up B
hg backout B
现在,您的工作目录与 B 之前的状态相同,我将其称为A'
.
退出后,进行真正的更改并提交。这就是您的历史记录的样子:
C
|
A'
|
B
|
A
其他人有一些摆脱“B”的好答案,但只要把它放在那里,你总是可以这样做:
hg push --rev C
这将推动 C 而不是 B 并且不会抱怨新的头。