27

我有一个 repo,我做了一个导致合并地狱的更改,我想假装它从未存在过。漫长而复杂的故事涉及将预先存在的 repo 拼接到通过 git-p4 更新的 repo 之上,但结果是我真的非常希望 git 假装某个更改从未存在。

如果是 Mercurial,我很确定我可以用 解决我的问题hg strip,但我在 Git 中找不到这样的命令。

感谢您提出的任何建议。

4

3 回答 3

33

您需要执行的命令不止一个。正如其他人提到的,第一个是git reset. 您需要在要删除的变更集之前找到变更集,然后使用

git reset --hard <changeset>

这将更改当前分支头(和索引)以指向该变更集,但“坏”变更集仍然存在。如果你推送它不会被包含,但是如果你克隆你的本地存储库它将被包含,并且它仍然可以在 log 和 checkout 命令中引用。

假设没有其他对它的引用(例如后续提交、标签等),您可以使用以下命令对其进行清理:

git gc --prune=now

感谢http://help.github.com/remove-sensitive-data/,我找到了这个命令,它还提到(与 一样hg strip)如果您将“坏”变更集推送到无法删除的远程位置它使用常规的 git 命令,但您需要采取额外的步骤来删除和重新创建服务器上的存储库并清理任何缓存的页面。

于 2012-04-29T16:59:33.680 回答
4

正如 larsks 所说git reset --hard可以帮助你回到你想要的历史:

  1. 找到要返回使用的正确 sha 值git log
  2. git reset --hard sha回来。
于 2012-03-31T02:56:07.420 回答
2

尝试阅读git reset. 我对 Mercurial 不是很熟悉,但如果我正确理解了这份文档git reset,您可以做同样的事情——也就是说,将您的存储库重置回其历史记录中的前一点。

本文档详细讨论了该reset命令,文档简要讨论了纠正错误的不同选项。

于 2012-03-31T00:46:09.000 回答