对于每个已修改的文件 (master)$ vi bar (master)$ vi baz (master)$ vi foo (master)$ git add foo bar baz (master)$ git reset --hard HEAD HEAD is now at ead8fa2 initial (master)$ git fsck --full --unreachable --no-reflog Checking object directories: 100% (256/256), done. unreachable blob 0c29287001b29159f11c4e8a320bce7e9789c00b unreachable blob 1524d3478e3d0b92866a53239b10bcd4b3838c4d unreachable blob 97b724e770249816c61d8a526415986208ed7e15 // take a look at one of the objects (master)git cat-file -p 0c29287001b29159f11c4e8a320bce7e9789c00b changes for bar //Here, based on inspecting the output, I can determine that 0c29287 was the file "bar" (master) git cat-file -p 0c29287 > bar (note我测试时没有得到任何丢失的树,因此这部分可能不起作用) 如果你修改了一大堆文件,通过树对象而不是单个文件可能更容易恢复
9条答案
按热度按时间83qze16e1#
不清楚你是丢失了工作目录中的文件,还是索引中的文件。你说你丢失了“未暂存的文件”,但你又说你可能运行了“git add”。“未暂存的文件”是永久丢失的。
可以使用以下命令恢复暂存文件
对于每个添加的文件,都会有一个丢失的blob对象,而对于每个目录项,都会有一个树对象。
对于每个已修改的文件
(master)$ vi bar (master)$ vi baz (master)$ vi foo (master)$ git add foo bar baz (master)$ git reset --hard HEAD HEAD is now at ead8fa2 initial (master)$ git fsck --full --unreachable --no-reflog Checking object directories: 100% (256/256), done. unreachable blob 0c29287001b29159f11c4e8a320bce7e9789c00b unreachable blob 1524d3478e3d0b92866a53239b10bcd4b3838c4d unreachable blob 97b724e770249816c61d8a526415986208ed7e15 // take a look at one of the objects (master)git cat-file -p 0c29287001b29159f11c4e8a320bce7e9789c00b changes for bar //Here, based on inspecting the output, I can determine that 0c29287 was the file "bar" (master) git cat-file -p 0c29287 > bar
(note我测试时没有得到任何丢失的树,因此这部分可能不起作用)
如果你修改了一大堆文件,通过树对象而不是单个文件可能更容易恢复
其中SHA是根树的丢失树对象。
3bygqnnd2#
使用git reset**--hard将删除所有未暂存/未提交的文件
不建议使用--hard,因为该选项会删除所有未登台/未提交的文件,而应该先stash**,然后使用正常重置
代替
你应该做
然后,您的代码将保存在隐藏堆栈中,您可以通过执行
尽管这个命令将“隐藏的”更改与它们当前的HEAD合并(一个隐藏的实现类似于一个分支),但建议在生成这些隐藏的相同提交上执行隐藏检索
t9eec4r03#
如果有人像我一样犯了同样的错误
git reset --hard
,在添加未暂存的文件之前,仍然有机会取回这些更改。虽然这些文件不再在repo中可用,但一些新的IDE保留了自己的历史记录。就像我的情况一样,我能够从Android Studio的本地历史记录功能(位于VCS下)取回未暂存的更改。说明:
mm5n2pyu4#
低技术提示,这可能是有用的一些。如果未暂存/未提交的文件,你失去了,在你的编辑器中打开。尝试做撤销该文件,你应该得到“以前版本”的文件从编辑器的历史堆栈。
5cg8jx4n5#
如果您使用了足够好的IDE/编辑器:
备注:
xv8emn3q6#
如果有人在寻找使用PycharmIDE的解决方案,
然后找到您删除的文件,右键单击它并选择“还原”,然后删除的文件将出现在文件夹中。
62o28rlo7#
如果你已经用
git add
暂存了文件,它仍然可以找到回来。但如果文件没有暂存,我不得不说没有办法。:(请记住,
git reset
确实不安全,尤其是对于未暂存的文件。但如果文件真的真的很重要,我能想到的是,你可以停止修改磁盘中的任何数据,并尝试使用
finaldata
等工具进行磁盘恢复。如果幸运的话,它可能会找到一些东西,因为你已经覆盖了git reset
之后的一些文件。无论如何,如果你熟悉
Git
,它确实是一个强大而酷的工具。rjjhvcjd8#
这和上面的想法非常相似,但是在我的例子中,我之前写过
git status
,并且在我的终端中有一个所有修改过的文件的列表,我可以从那里复制文件列表,然后在Visual Code上逐个打开文件(希望它仍然缓存了文件修改)。检查你是否在某处有文件列表,并希望你的编辑器缓存了保存的副本。u5i3ibmn9#
再回答一个“如果您使用的是特定的IDE...”问题...
如果您正在使用IntelliJ(或者我怀疑是任何其他JetBrains IDE),那么您可以:
更多详情:https://blog.jetbrains.com/idea/2020/02/local-history-in-intellij-idea-may-save-your-life-code/