我有一个善变的存储库。这是在转发A.我做了一些改变,承诺(转B),并推动。然而,后来,我意识到我不想做出那些改变。我更新回到rev A,并进行了一些替代更改,以修改C。
C
| -
| B
|/
A
然而,现在我无法推动rev C,因为它抱怨它会创建一个新的远程头(它会)。如何使远程mercurial简单地忘记rev B及其中的所有更改,所以我可以推动rev C并从那里继续进行?
答案 0 :(得分:5)
Editing History很难。将变更集推送到公共存储库后,就无法再从历史记录中轻松删除它。
您问题的最直接解决方案是:
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中描述的方法之一。
答案 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而不是抱怨新的头脑。