删除所有本地变更集并恢复为树

Posted

技术标签:

【中文标题】删除所有本地变更集并恢复为树【英文标题】:Delete all local changesets and revert to tree 【发布时间】:2011-01-09 11:55:49 【问题描述】:

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

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

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

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

【问题讨论】:

Is there any way to delete local commits in Mercurial?的可能重复 【参考方案1】:

当最简单的方法(新的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())'

【讨论】:

谢谢!我最终遇到了一个完美解决的情况,没有任何大惊小怪。 这把我从上面的大修复中救了出来,非常简单,谢谢! 如果有人因为无法识别'roots(outgoing())' 而无法让hg strip 'roots(outgoing())' 工作。我能够让它与hg strip "roots(outgoing())"一起工作。 @SombreErmine 在cmd.exe,是的。【参考方案2】:

您需要创建一个本地克隆,仅保留远程存储库中也存在的变更集。使用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 以将远程存储库中的任何新变更集获取到您的克隆中并像往常一样继续。


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

【讨论】:

我也有同样的情况,但在 repo 目录中也有很多文件,但在 hgignore 中。无法安装 hg strip 并希望在不替换整个克隆的情况下删除本地提交。有任何想法吗? ——啊!如果我没有添加任何文件,我应该可以将另一个克隆复制到我的旧目录中!? 如果您有多个分支,请小心使用此方法。克隆到指定修订版只会获取指定修订版分支上的变更集。然后,您可能需要 hg pull -r 获取每个附加分支的最后一个“好”版本。【参考方案3】:

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

【讨论】:

谢谢。当您说“删除所有本地内容”时,您的意思是删除整个存储库,还是仅删除我的更改? hg init 做了什么(谷歌搜索但看不到简单的解释),我需要使用任何标志吗?它会删除我的 Mercurial .hgrc 首选项等内容吗? 更新:如果我删除项目根目录中的所有内容,然后键入 'hg init',我会得到 'abort: repository 。已经存在!'。我是否需要从新目录进行设置和工作?如果可能的话,我宁愿不要……肯定有一种简单的方法可以杀死我在本地所做的一切?! 是的,删除所有内容,包括所有存储库内容。从一个新的干净文件夹开始。您可以将首选项保存在备份文件中,然后将它们恢复到您使用 hg init reponame 创建的新存储库中。初始化和东西的详细信息:hgbook.red-bean.com/read/mercurial-in-daily-use.html alemjerus: hg init + hg pull = hg clone 不同之处在于hg clone 为您制作了一个不错的.hg/hgrc 文件,而hg clone 将在克隆时使用硬链接来节省空间在同一个文件系统上。 Richard:hg help init 的输出在这里:selenic.com/mercurial/hg.1.html#init 但也许这太简洁了?如果您需要更多帮助,请发送邮件到我们的邮件列表!见:mercurial.selenic.com/wiki/MailingLists【参考方案4】:

你可以使用

汞带修订

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

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

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

【讨论】:

您可以在公开修订版中使用它,但如果您再次拉取,它将重新出现。 (hg strip 仅适用于本地存储库。)【参考方案5】:

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

【讨论】:

【参考方案6】:
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`

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于删除所有本地变更集并恢复为树的主要内容,如果未能解决你的问题,请参考以下文章

git如何恢复本地删除的文件

Select2 通过 AJAX 加载 JSON 结果集并在本地搜索

Git 恢复误删除的本地仓库文件

WAMP 卸载后恢复本地数据库

GitHub 恢复本地被删除的文件

SVN删除本地文件有没有办法恢复?