2

我有一个 mercurial 存储库。它在修订版 A 上。我做了一些更改,提交(到修订版 B)并推送。然而,后来,我意识到我不想做出这些改变。我更新回版本 A,并对版本 C 进行了一些替代更改。

C
| -
| B
|/
A

但是,现在我无法推送 rev C,因为它抱怨它会创建一个新的远程头(它会)。如何让远程 mercurial 简单地忘记 rev B 和其中的所有更改,以便我可以推送 rev C 并从那里继续?

4

5 回答 5

5

编辑历史很难。一旦将变更集推送到公共存储库,就不能再轻易地从历史记录中删除它。

解决您的问题的最直接方法是:

  1. hg update <tip of branch you want to forget>
  2. hg commit --close-branch -m "close unwanted branch"
  3. hg update <tip of branch you want to keep>
  4. 推送您的所有更改。正如您所指出的,您将需要使用,--force因为分支上现在存在多个头。

如果您确实需要修剪分支,请再次阅读EditingHistory。如果看起来仍然可行,您可以使用PruningDeadBranches中描述的方法之一。

于 2012-06-13T13:46:09.080 回答
4

就我个人而言,我会关闭分支并强制推送(正如 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 的任何更改。

于 2012-06-13T14:33:29.973 回答
3

使用backout命令反转 B 更改。

hg up B
hg backout B

现在,您的工作目录与 B 之前的状态相同,我将其称为A'.

退出后,进行真正的更改并提交。这就是您的历史记录的样子:

C
|
A' 
|
B
|
A
于 2012-06-13T14:54:53.033 回答
1

Mercurial 分支是永久的,并在提交对象中注册。有一些(不太容易)关闭和/或删除分支的方法,主要在这里列出。我什至已经使用过其中的一些。请注意,对于确实使用分支的人来说,这些解决方案有些绝望,认为它们可以是临时的。

但是,如果您真的想要临时分支,请使用书签

于 2012-06-13T13:17:00.717 回答
1

其他人有一些摆脱“B”的好答案,但只要把它放在那里,你总是可以这样做:

hg push --rev C

这将推动 C 而不是 B 并且不会抱怨新的头。

于 2012-06-13T15:22:36.997 回答