撤消hg推送(退出?)

时间:2010-09-21 23:25:27

标签: mercurial merge tortoisehg

我做了一个很大的哎呀,并且可以使用一些帮助撤消它。

我们有两个存储库 - 一个相当稳定的存储库,以及我们正在进行更改的存储库。我只是在我们的稳定存储库中进行了一个缺陷修复,并将其移动到工作存储库。我从稳定的存储库中取出,合并,然后意外地推送到稳定的存储库。

稳定的存储库现在看起来像这样:

*merge
| \
|  \
|   *b
*a  |
|  / 
*c

其中a是应该是稳定存储库提示的提交,b是我们在开发存储库中完成的所有工作,而c是关键点我们分支了开发存储库。

我如何回归:

*a
|
*c

(我知道我无法真正做出改变,我只是在寻找功能结构......)

我读过一些让我觉得hg backout是我需要的命令的东西,但我不确定它是做什么的。

4 个答案:

答案 0 :(得分:48)

hg rollback会恢复最后一笔交易,因此您将留下未完成的合并,您必须使用hg update -C才能退出。

如果您不想要* b(在另一个克隆中有它),则启用内置MQ扩展并运行hg strip -r <*b>。它将摆脱* b和*合并。默认情况下,它会保存备份,以防您再次改变主意。


更新(根据@Rudi的评论:抱歉,我错过了“已推出”部分)

由于合并已经推出,从来没有做我之前建议的。来自其他开发者的讨厌电子邮件将是最好的结果。

请改为:

hg up -r<*merge>
hg revert -r<*a> -a
hg ci -m "undo unintended merge"

或者你可能更犹豫:

hg up -r<*merge>
hg backout -r<*merge> --parent<*a>

答案 1 :(得分:2)

由于您已经推动了更改,我认为制作hg rollback为时已晚。

您可以尝试使用MQ扩展,但这也适用于本地。 hg strip只会修改您的本地仓库。你当然可以尝试直接在服务器上修改你的服务器仓库,但是如果有人拉了它就太晚了。

另一个选项在 hgbook 的chapter 9中描述退出合并。它涉及hg backout命令但对你来说可能是一种矫枉过正......

我建议hg update -C修改*,与提示合并并忽略来自* merge的所有更改?您的存储库看起来或多或少会像这样:

*second merge
 |  \ 
 |   \ 
 |    \     
 |     \ 
*merge | 
| \    |
|  \   |
|   *b |
*a  | /
|  / /
*c---

此命令是

  • $ hg --config ui.merge=internal:local merge #keep my files
  • $ hg --config ui.merge=internal:other merge #keep their files

可以找到更多详细信息here

答案 2 :(得分:0)

hg rollback将恢复最后一次提交,删除原本会发生的任何历史记录。

所以,如果你从这开始:

*merge
| \
|  \
|   *b
*a  |
|  / 
*c

hg rollback将给出:

*a  *b
|  / 
*c

请注意,您只能hg rollback一次。

在进行回滚之前,您应该对存储库进行完整备份。为此,只需hg clone整个存储库。

答案 3 :(得分:0)

你们都对这个问题提出了很少复杂的解决方案,我们任何人都可以解决这个问题。

我做了什么,我在远程桌面上登录到我的中央存储库,并且mq扩展名已将修订状态更改为&#34; draft&#34;并且&#34;规定&#34; -ed他们。

唯一的缺点是,如果某人拥有带有修改版本的回购副本并将推送,他们将重新出现。所以,如果可以,请其他人 a)做同样的(草稿,条带) b)删除其本地存储库并使用修改后的存储库进行重新同步

使用TortoiseHg可以轻松实现所有目标。