删除所有本地变更集并还原到树

我正在使用Mercurial,当地有三个头,我陷入了一个糟糕的混乱局面。 我不能推,我只是想删除所有我的本地更改和提交,并重新启动完全干净的代码和一个干净的历史。

换句话说,我想结束(a)在本地完全相同的代码存在于远程分支的提示和(b)没有任何本地提交的历史。

我知道hg update -C覆盖任何本地更改。 但是,如何删除任何本地提交?

要清楚,我没有兴趣保存我在本地完成的任何工作。 我只想要最简单的方法来恢复到完全干净的本地结帐。

当最简单的方法(一个新的hg clone )是不实际的,我使用hg strip ,它与mq扩展名一起:

 % hg outgoing -l 1 % hg strip $rev # replace $rev with the revision number from outgoing 

重复,直到hg outgoing保持安静。 请注意, hg strip $rev删除$rev及其所有后代。

PS:更聪明的做法是使用revset语言,并且:

 % hg strip 'roots(outgoing())' 

您将需要创build一个本地克隆,只保留远程存储库中也存在的变更集。 使用TortoiseHg , hg log或者类似的方法来确定你的修订版本是你没有做的最新的版本(乱码开始之前的版本)。 使用hg outgoing可以在这里帮助 – 它会列出你所做的所有变更集 – 比任何一个select一个修订版本号。

如果目标版本被称为good并且你的克隆被称为foo ,那么:

 hg clone -r good foo foo-clean 

这将是一个快速的本地操作 – 没有理由再次下载一切foo-clean克隆将只包含修改good修改集。 现在,您可以用foo-clean/.hg/hgrcreplacefoo-clean/.hg/hgrc ,以便保留存储库本地设置,例如默认的推/拉path。

当你满意foo-clean拥有你需要的所有东西的时候,只需要删除foo并将foo-clean重命名为foo 。 做一个hg pull来从远程仓库获取任何新的变更集到你的克隆中,并继续正常。


如果没有人将新的更改集推送到远程存储库,那么确定要在上面使用哪个版本是非常简单的: hg id default将告诉您远程存储库中的提示的ID。

好。 所以只要删除所有本地的东西, hg init新的本地存储库和hg pull你有最新的提示。 此后不要忘记hg update

你可以使用

hg带修订

杀死本地存储库中的任何修订及其子树。

https://www.mercurial-scm.org/wiki/Strip

但是不要试图将它用于任何已经被推送的东西。

只需删除本地系统上的所有内容,然后重新克隆远程回购。

  hg strip`hg out --template“{rev} {author} \ n”|  grep YOUR_AUTHOR_NAME | 切“-f 1” 

为我做的伎俩。

它将所有未推送到使用您的作者姓名创build的默认存储库的版本进行分解。

您也可以使用这种风格,使其不使用默认的存储库,但与另一个存储库

  hg strip`hg out OTHER_REPO_ALIAS --template“{rev} {author} \ n”|  grep YOUR_AUTHOR_NAME | 切“-f 1” 

如果你正在使用TortoiseHg,一个简单的方法就是首先更新到最新版本,然后select你的变更集,并启动“本地合并”。 当合并对话出现时,只需点击小的“+”图标即可显示一些额外的选项,其中之一是“放弃合并目标(其他)修订”中的变更集。 这样做意味着你的变更集仍然会在回购中被推入,但是不会有效果,因为它们将在合并中被丢弃。 如果你有很多变更集,那么你可能不想用这种方式来污染回购,但这是一个简单的修复方法,值得考虑一下,如果你丢弃的变更集中包含你稍后想引用的数据。