删除所有本地变更集并还原到树
我正在使用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/hgrc
replacefoo-clean/.hg/hgrc
,以便保留存储库本地设置,例如默认的推/拉path。
当你满意foo-clean
拥有你需要的所有东西的时候,只需要删除foo
并将foo-clean
重命名为foo
。 做一个hg pull
来从远程仓库获取任何新的变更集到你的克隆中,并继续正常。
如果没有人将新的更改集推送到远程存储库,那么确定要在上面使用哪个版本是非常简单的: hg id default
将告诉您远程存储库中的提示的ID。
好。 所以只要删除所有本地的东西, hg init
新的本地存储库和hg pull
你有最新的提示。 此后不要忘记hg update
。
只需删除本地系统上的所有内容,然后重新克隆远程回购。
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你的变更集,并启动“本地合并”。 当合并对话出现时,只需点击小的“+”图标即可显示一些额外的选项,其中之一是“放弃合并目标(其他)修订”中的变更集。 这样做意味着你的变更集仍然会在回购中被推入,但是不会有效果,因为它们将在合并中被丢弃。 如果你有很多变更集,那么你可能不想用这种方式来污染回购,但这是一个简单的修复方法,值得考虑一下,如果你丢弃的变更集中包含你稍后想引用的数据。