2

我刚开始玩 Git,想知道一个具体案例:

我错误地进行了重提交,更糟糕的是,我将其推送到了远程服务器。

现在我试图让事情恢复到原来的样子,使用git reset --hard v1.0and git push -f origin master.

这样做之后看起来还不错,但是当我查看 repo 文件大小时,它仍然和我的错误提交一样大。即使我尝试git gc进行垃圾收集,我也没有成功。在这种情况下,如果我想故意进行破坏性更改,我应该怎么做?

任何提示表示赞赏!

4

4 回答 4

3

您可能已经更改了历史记录,但是您尚未清除的是 reflog。

如果您键入:

git reflog

你会看到你的“大提交”仍然存在。默认情况下,如果无法访问所有条目,则保留 30 天,如果可访问,则保留 90 天(通过历史记录)。

例如,您可以尝试使用git reflog --expire-unreachable=1.minute

于 2013-01-10T20:26:48.000 回答
2

您必须使您回绕的分支的 reflog 和 HEAD reflog 过期,然后 gc 可以收集现在无法访问的提交:

git reflog expire --expire=now HEAD <branches which contained said commit>
git gc

reflog 是 Git 的安全机制,它跟踪以前的分支状态,因此在发出不正确的 git reset 命令或运行虚假的 rebase 时,您不会立即丢失数据,无论多么时髦。

于 2013-01-10T20:27:11.347 回答
1

我重复了我在开始时说的步骤,制作了一个新的 repo 克隆,现在很好。感谢你们!

于 2013-01-11T14:06:56.747 回答
1

最简单的解决方案是再次克隆存储库。但是,如果您的存储库很大,则可能需要很长时间。要删除文件而不再次克隆项目,您可以等待一段时间让 git 自动删除文件或使用以下命令强制删除:

git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
于 2013-01-10T20:31:39.470 回答