95

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

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

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

需要明确的是,我对保留我在本地所做的任何工作都没有兴趣。我只想要最简单的方法来恢复到完全干净的本地结帐。

4

7 回答 7

131

当最简单的方法(新的hg clone)不实用时,我使用hg strip

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

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

请注意,您可能必须先在 Mercurial 设置中启用strip

PS:更聪明的方法是使用 revset 语言,并执行以下操作:

% hg strip 'roots(outgoing())'
于 2010-01-27T00:18:10.637 回答
21

您需要创建一个本地克隆,仅保留远程存储库中也存在的变更集。使用TortoiseHghg log类似方法来确定您的哪些修订是您没有进行的最新修订(混乱开始之前的修订)。在这里使用hg outgoing可以提供帮助——它将列出您所做的所有变更集——选择一个比其中任何一个更早的修订号。

如果调用了目标修订版并且调用了good您的克隆foo,则执行以下操作:

hg clone -r good foo foo-clean

这将是一个快速的本地操作——没有理由再次下载所有内容foo-clean克隆将只包含修订版的变更集good。您现在可以替换foo-clean/.hg/hgrcfoo/.hg/hgrc以保留您的存储库本地设置,例如默认的推/拉路径。

当您对foo-clean拥有所需的一切感到满意时foo,只需删除foo并重命名foo-cleanfoo. 执行 ahg pull将远程存储库中的任何新变更集获取到您的克隆中并像往常一样继续。


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

于 2010-01-27T00:02:40.873 回答
9

行。因此,只需删除所有本地内容、hg init新的本地存储库和hg pull您拥有的最新提示。别忘了hg update在这之后。

于 2010-01-26T12:01:53.510 回答
5

您可以使用

汞条修订

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

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

但是不要尝试将它用于已经推送的任何内容。

于 2011-07-07T15:18:45.010 回答
2

只需删除本地系统上的所有内容并重新克隆远程存储库。

于 2010-01-26T12:26:30.660 回答
2
hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | 剪切-d“”-f 1`

对我有用。

它会删除所有未推送到使用您的作者姓名创建的默认存储库的修订。

您还可以使用此样式使其不检查默认存储库,而是检查另一个存储库

hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | 剪切-d“”-f 1`
于 2011-08-17T05:48:27.403 回答
0

如果您使用的是 TortoiseHg,摆脱(小)混乱的一种简单方法是首先更新到最新版本,然后选择您的变更集并启动“与本地合并”。出现合并对话框时,只需单击小“+”图标即可显示一些额外选项,其中之一是“从合并目标(其他)修订版中丢弃变更集”。这样做意味着您的变更集仍将在 repo 中并被推送,但不会产生任何影响,因为它们将在合并中被丢弃。如果您有很多跨越多个头的变更集,您可能不想以这种方式污染存储库,但这是一个简单的修复,如果您要丢弃的变更集包含您以后可能想要引用的数据,则值得考虑。

于 2014-12-02T14:38:20.143 回答