破坏了最近的GIT提交记录...如何恢复?

4

我是新手使用 Git,我可能已经破坏了一些超出我的能力范围的东西(好耶)。

以下是具体情况:

我创建了一个远程目录,并意外地在最初的提交中包含了一些非常大的文件。这使得其他人难以处理它。(起初我没有意识到这一点,并进行了修改,而且自己使用了该目录一段时间)

我发现仅仅删除文件并提交删除操作不能帮助其他人克隆该目录,并学习了通过命令修改历史记录的方法,例如:

git filter-branch --tree-filter 'rm -f public/vidos/*' HEAD

据我所知,这将删除public/vidos/目录下的所有文件,并且消除所有与它们有关的记忆。

这似乎确实发生了。我能够成功地克隆东西(没有内存错误),并且克隆的副本中没有超大的文件。

然后,今天早上,(在愚蠢地确保我完全匹配远程仓库之后(即摆脱了所有本地内容,认为它应该是最新的,除了那些大文件之外),我开始使用该目录进行工作,并意识到所有文件似乎与最初的检入时一样(没有修改,并且我修改了很多东西,但没有显示出来)

我做了:

git log

查看所有修改,可以看到我所有的提交(包括从目录中删除超大文件的提交)。然后我进行了操作。

git reset hashcode

要回滚到适当的git版本(使用我从日志中获得的哈希码)。

然而...尽管它认为我已经处于正确的提交,但文件仍与我最初提交的文件完全相同。

我可以回头看看我的历史记录,发现我没有在任何当前未修改的文件上进行filter-branch...我真的很困惑,为什么我的更改不再存在。我提交了...我推送了...我确信远程存储库有我的所有更改(可以检出它(会花费很长时间并耗尽内存,但我会得到文件)并查看更改......但我再也看不到它们了。

我做了一些愚蠢的事吗?改变历史纪录会引起我意想不到的问题吗?我描述的操作完全不可能损坏我的存储库吗?(即我应该寻找完全不同的方向吗?)

我真的非常想要恢复我的修改...复制所有代码(并记住我究竟做了什么)将会非常困难。我能做些什么吗?

编辑:

~~~~~~~~~~~

好吧,重置没有起作用,但是执行以下操作:

git checkout hashcode

看起来一切都很正常,我可以看到我的代码更改。

但是,检出意味着我不在任何分支中,因此我无法将这些更改提交为最新的(它认为已经是最新的)。有什么办法可以使这个提交成为“head”吗?一旦它变成了“head”,那么是否会消除我用来摆脱超大文件的分支过滤?如果是这样,有没有人有关于如何摆脱这些超大文件而不再头痛的建议。

如果没有其他办法,我能否简单地检出两份副本(一个在head,一个在我上次好的提交),然后手动将好的文件复制粘贴到head中,然后提交?看起来这样做是可行的,但不太干净。


git reflog 会显示什么?你能在其中找到任何不可达的提交吗? - VonC
64e3dcb... HEAD@{0}: 64e3dcb92ca80d6d53bb92d9470ca269f73ae044: 更新 HEAD 7d71565... HEAD@{1}: 克隆:来自 git@10.252.9.109:/var/git/pcms_vodpop - J.R.
但是...嗯...我有一种感觉,这么短是因为我愚蠢地删除了本地副本并重新克隆它以测试克隆是否仍在工作。 - J.R.
如果您删除了本地副本并且存储库中没有相关内容,那么它们将不复存在。请查看团队中是否有其他人仍然拥有重写历史之前的存储库。 - Daenyth
1个回答

1

基本上,

 git checkout hashcode

做了我本以为 git reset 会做的事情。当我分支筛选时,我不确定为什么更改被回滚了,但是现在我至少可以再次看到代码,所以我只是手动将更改复制到 head 的克隆中,然后重新将更改检入。虽然这并不是最优雅的解决方案,但是我既保留了我的筛选又拥有了最新的代码。

我认为可能发生的部分原因是我对 git 存储库的理解不完整。我以前从未真正管理过 git 存储库,但我有这样一个半实现的概念,即 git 存储库始终是“最新的”,并且拥有最新版本的文件。 当我进行分支筛选时,我在 git 存储库中,我注意到筛选器在 git 状态中需要提交。 所以我就提交了。 可能存储库实际上并没有处于“最新状态”,因此在提交(并轻率地覆盖)时,我可能覆盖了更改并将事情归零了。


git reset 只会重置索引;你需要使用 git reset --hard。 - Ben Stiglitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接