我正在使用Mercurial,我在当地遇到了一个可怕的混乱,有三个头。我无法推送,我只想删除所有本地更改和提交,然后使用完全干净的代码和干净的历史记录重新开始。
换句话说,我希望最终得到(a)与远程分支的尖端中存在的本地完全相同的代码,以及(b)没有任何本地提交的历史记录。
我知道hg update -C
会覆盖任何本地更改。但是如何删除任何本地提交?
要说清楚,我没有兴趣保留我在当地完成的任何工作。我只是希望以最简单的方式恢复到完全干净的本地结账。
答案 0 :(得分:128)
如果最简单的方式(新hg clone
)不实用,我会使用hg strip
:
% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing
重复直到hg outgoing
保持安静。请注意,hg strip $rev
会删除$rev
及其所有后代。
请注意,您可能需要first enable strip
in your Mercurial settings。
PS:更智能的方法是使用revset语言,并执行:
% hg strip 'roots(outgoing())'
答案 1 :(得分:21)
您需要创建一个本地克隆,其中只保留远程存储库中也存在的更改集。使用TortoiseHg,hg log
或类似内容来确定哪些修订是您未制作的最新修订(在乱七八糟的开始之前)。使用hg outgoing
可以在这里提供帮助 - 它将列出您所做的所有变更集 - 选择比任何变更集更早的版本号。
如果调用目标修订版good
并且您的克隆名称为foo
,则执行:
hg clone -r good foo foo-clean
这将是一个快速的本地操作 - 没有理由再次下载所有内容。 foo-clean
克隆仅包含最高为修订版good
的变更集。您现在可以将foo-clean/.hg/hgrc
替换为foo/.hg/hgrc
,以保留存储库本地设置,例如默认的推/拉路径。
如果您确信foo-clean
包含了foo
所需的所有内容,则只需删除foo
并将foo-clean
重命名为foo
。执行hg pull
以将任何新的更改集从远程存储库中获取到克隆中并继续正常运行。
如果没有人将新的变更集推送到远程存储库,那么确定要将哪个版本用作上面的good
非常简单:hg id default
会告诉您该变更的ID远程存储库。
答案 2 :(得分:9)
确定。所以只需删除所有本地内容,hg init
新的本地存储库和hg pull
最新的提示。在此之后不要忘记hg update
。
答案 3 :(得分:5)
您可以使用
hg strip revision
删除本地存储库中的任何修订及其子树。
https://www.mercurial-scm.org/wiki/Strip
但是不要试图将它用于任何已被推动的东西。
答案 4 :(得分:2)
只需删除本地系统上的所有内容,然后重新克隆远程仓库。
答案 5 :(得分:2)
hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
为我做了诀窍。
它删除了未推送到使用您的作者姓名创建的默认存储库的所有修订。
您还可以使用此样式使其不使用默认存储库进行检查,而是使用其他存储库进行检查
hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
答案 6 :(得分:0)
如果你正在使用TortoiseHg,一个简单的方法来摆脱(小)混乱是首先更新到最新版本,然后选择你的变更集并启动“与本地合并”。当出现合并对话框时,只需单击小“+”图标即可显示一些额外选项,其中一个是“从合并目标(其他)修订版中丢弃更改集”。执行此操作意味着您的更改集仍将在repo中并被推送,但不起作用,因为它们将在合并中被丢弃。如果你有很多变化集跨越多个头,你可能不想以这种方式污染回购,但这是一个简单的修复,值得考虑你丢弃的变更集是否包含你以后想要引用的数据。