我是新手使用 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