删除所有本地更改集并还原为树

时间:2010-01-26 11:58:07

标签: version-control mercurial dvcs head

我正在使用Mercurial,我在当地遇到了一个可怕的混乱,有三个头。我无法推送,我只想删除所有本地更改和提交,然后使用完全干净的代码和干净的历史记录重新开始。

换句话说,我希望最终得到(a)与远程分支的尖端中存在的本地完全相同的代码,以及(b)没有任何本地提交的历史记录。

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

要说清楚,我没有兴趣保留我在当地完成的任何工作。我只是希望以最简单的方式恢复到完全干净的本地结账。

7 个答案:

答案 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)

您需要创建一个本地克隆,其中只保留远程存储库中也存在的更改集。使用TortoiseHghg 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中并被推送,但不起作用,因为它们将在合并中被丢弃。如果你有很多变化集跨越多个头,你可能不想以这种方式污染回购,但这是一个简单的修复,值得考虑你丢弃的变更集是否包含你以后想要引用的数据。