'忘记'一个死胡同

时间:2012-06-13 13:11:11

标签: mercurial branch

我有一个善变的存储库。这是在转发A.我做了一些改变,承诺(转B),并推动。然而,后来,我意识到我不想做出那些改变。我更新回到rev A,并进行了一些替代更改,以修改C。

C
| -
| B
|/
A

然而,现在我无法推动rev C,因为它抱怨它会创建一个新的远程头(它会)。如何使远程mercurial简单地忘记rev B及其中的所有更改,所以我可以推动rev C并从那里继续进行?

5 个答案:

答案 0 :(得分:5)

Editing History很难。将变更集推送到公共存储库后,就无法再从历史记录中轻松删除它。

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

  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,因为现在存在分支上的多个头。
  5. 如果您确实需要修剪分支,请再次阅读EditingHistory。如果它仍然可行,您可以使用PruningDeadBranches中描述的方法之一。

答案 1 :(得分:4)

就我个人而言,我会关闭分支并强制推动(如Tim Henigan描述的那样),因为它使DAG处于一个真实的状态。还有另一种选择。做dummy merge。这是一个合并,但您可以忽略传入的更改。

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的变化。

答案 2 :(得分:3)

使用backout命令撤消B更改。

hg up B
hg backout B

现在,您正在工作的目录处于B之前的状态,我将其称为A'

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

C
|
A' 
|
B
|
A

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

其他人对于摆脱'B'有一些很好的答案,但只是把它放在那里你可以随时做:

hg push --rev C

这将推动C而不是B而不是抱怨新的头脑。