使用未提交的文件撤销 git reset --hard

4

我有一个已存在的Java项目,我做了以下操作:

cd existing_folder
git init
git remote add origin URL
git add .
git reset --hard

我不小心执行了git reset --hard,有没有办法恢复我的数据?

这将删除我项目中的所有目录和文件。


很抱歉,您将无法通过git获取您的文件。 - Henridv
这个回答解决了你的问题吗?在git中reset --hard后恢复已添加但未提交的文件 - phd
https://stackoverflow.com/search?q=%5Bgit%5D+recover+files+hard+reset - phd
4个回答

1

请参考在添加文件(未提交)时重置git后恢复文件。这里有一个小技巧:不要只是:

git fsck

打印一堆“悬挂的 blob”信息,你必须像其被接受的答案所示保存并检查,使用:

git fsck --lost-found

这一次,Git 不仅仅是“说”出 dangling blob *hash,而是会将“悬空的 blob”文件的内容提取到 .git/lost-found/other 目录下。提取后的文件名将是 blob hash ID。内容可能是你使用 git add . 添加的文件之一,也可能是其他早期操作留下的未使用的内容。(在这种情况下,由于 Git 存储库本身是新的,不应该有这样的文件。)
不幸的是,文件的名称全部丢失:它们在索引中,但索引已通过 git reset 重新设置,并且不再具有文件的正确名称。如果您可以手动从内容映射回文件名,则可以将文件从 .git/lost-found/other 目录移动或复制到最初的任何名称下。

当你完成后,可以删除.git/lost-found/commits中的内容(如果有),以及.git/lost-found/other中剩余的任何内容。在你的情况下,.git/lost-found/commits中应该没有任何东西。


1

只有一种方法可以找到添加到索引中的文件内容:

find .git/objects -type f | sed 's/.git\/objects\///g' | sed 's/\///g' | xargs -n 1 git cat-file -p

希望这能有所帮助!你可以在官方文档中找到关于Git对象的额外文档。


1
不确定是谁对这个答案进行了负评,因为它应该可以工作(至少在类Unix系统上)。但是,它会将所有内容放入一个大的stdout流中。 - torek

1
你可以尝试从索引对象中恢复。我认为这是你要找的。
之前暂存的更改(git add)应该可以从索引对象中恢复。
git reset HEAD@{0}

您可以使用 git reflog show 命令来列出索引。
git reflog show

输出将类似于

a


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

更详细的信息 如何从 git reset --hard 恢复?

此外,您可以使用 git fsck --lost-found 将对象写入 .git/lost-found/ 中。在那里,您可以使用 git show <filename> 查看每个文件的内容。


实际上,此时没有进行任何提交,因此 reflog 为空。 - stck

0

git reset --hard 命令将工作区重置到最后一次提交。不幸的是,Git 中没有撤销此操作的方法,因此除非您有其他形式的备份,否则就无法恢复了。


如果文件不在索引中,则它们就丢失了。 - Lalit Mohan

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