【发布时间】:2020-05-07 09:43:23
【问题描述】:
我有一个现有的 java 项目,我做了以下操作
cd existing_folder
git init
git remote add origin URL
git add .
git reset --hard
我不小心做了 git reset --hard 有什么办法可以恢复我的数据
就这样删除了我项目的所有目录和文件
【问题讨论】:
-
恐怕您将无法通过 git 取回您的文件。
我有一个现有的 java 项目,我做了以下操作
cd existing_folder
git init
git remote add origin URL
git add .
git reset --hard
我不小心做了 git reset --hard 有什么办法可以恢复我的数据
就这样删除了我项目的所有目录和文件
【问题讨论】:
git reset --hard 将工作重置为最后一次提交。不幸的是,Git 没有办法撤消这个操作,所以除非你有其他形式的备份,否则你就不走运了。
【讨论】:
只有找到添加到索引的文件内容的方法:
find .git/objects -type f | sed 's/.git\/objects\///g' | sed 's/\///g' | xargs -n 1 git cat-file -p
希望这会有所帮助! 您可以在 official docs 中找到有关 git 对象的其他文档
【讨论】:
您可以尝试从索引对象中恢复。我想你正在寻找这个。
以前阶段性的更改(git add)应该可以从索引对象中恢复
git reset HEAD@{0}
您可以使用git reflog show 列出索引
git reflog show
输出会像一个
93567ad HEAD@{0}: reset: moving to HEAD@{6}
203e84e HEAD@{1}: reset: moving to HEAD@{1}
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug
更多详情Recover from git reset --hard?
您也可以将对象写入.git/lost-found/ 和git fsck --lost-found。在那里您可以使用git show <filename> 查看每个文件的内容。
【讨论】:
见Recover files in git after reset --hard on added files(not committed!)。您可以使用一些捷径:而不仅仅是:
git fsck
它会打印一堆dangling blob 消息,您必须保存并检查它们,如accepted answer 所示,使用:
git fsck --lost-found
这一次,Git 不只是说dangling blob *hash,而是将那个“悬空的blob”文件的内容提取到.git/lost-found/other。提取文件的名称将是 blob 哈希 ID。 内容 将是您git add 和git add . 编辑的文件之一,或者是一些其他早期操作遗留下来的内容,这些操作添加了内容但最终没有使用它。 (在这种情况下,由于 Git 存储库本身是新的,因此不应该有任何此类文件。)
不幸的是,文件的名称全部丢失:它们在索引中,但现在已通过git reset 重新设置索引并且不再具有文件的正确名称。如果您可以手动将内容映射回文件名,则可以移动或复制 .git/lost-found/other 目录中的文件,使其以原来的任何名称存在。
(全部完成后,您可以删除.git/lost-found/commits 的内容(如果有)以及.git/lost-found/other 中剩余的任何内容。在您的情况下,.git/lost-found/commits 中应该没有任何内容。)
【讨论】: