我尝试了git reset --hard HEAD@{n}
from git reflog
,但我丢失了当前未暂存文件的所有内容:'(
未暂存的文件是git add
我做的最后一个文件,在此之前我尝试git reset
了最后一个git commit
.
我所有的文件都消失了,我无法回到git add
上次提交之前的内容:'(
目前尚不清楚您是否丢失了工作目录中的文件或索引中的文件。你说你丢失了你的“未暂存文件”,但是你提到你可能已经运行了“git add”。“未暂存的文件”将永远丢失。
暂存文件可以通过以下方式恢复
git fsck --full --unreachable --no-reflog
对于添加的每个文件,都会丢失一个 blob 对象,并且对于每个目录条目,都会有一个树对象。您将通过执行恢复文件更改
git cat-file -p SHA
对于您修改的每个文件
(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
(注意我测试时没有丢失任何树木,所以这部分可能不起作用)
如果您修改了一大堆文件,通过树对象而不是单个文件可能更容易恢复
git read-tree SHA
其中 SHA 是根树的丢失树对象。
所有未暂存/未提交的文件将使用 git reset --hard删除
不推荐使用 --hard ,因为该选项会删除所有未暂存/未提交的文件,而是应先存储,然后使用正常重置
代替
git reset --hard HEAD@{n}
你应该做
git stash
git reset HEAD@{n}
然后将您的代码保存在存储堆栈中,您可以通过执行再次检索它
git stash pop
尽管此命令将“隐藏”更改与其当前 HEAD 合并(存储像分支一样实现),但建议在生成这些存储的相同提交上进行存储检索
可能对某些人有用的低技术提示。如果您丢失了未暂存/未提交的文件,请在编辑器中打开。尝试撤消该文件,您应该从编辑器历史堆栈中获取该文件的“先前版本”。
类似于 UsamaAmjad 和 Juank 的答案。
如果您使用了足够好的 IDE/编辑器:
笔记:
如果有人使用 Pycharm IDE 寻找解决方案,
然后找到您删除的文件,右键单击它并选择“恢复”,然后删除的文件将出现在文件夹中。
如果您使用 暂存文件git add
,仍然可以找到它。但如果文件没有暂存,我不得不说没有办法。:(
请记住,这git reset
确实不安全,尤其是对于未暂存的文件。
但是如果这些文件真的很重要,我能想到的是,你可以停止修改磁盘中的任何数据,并尝试使用finaldata
. 如果幸运的话,它可能会找回一些东西,因为您已经在git reset
.
无论如何,Git
如果您熟悉它,它确实是一个强大而酷的工具。
这与上述所有想法非常相似,但就我而言,我之前写过git status
并且在我的终端中有一个所有已更改文件的列表,我可以从中复制文件列表,然后逐个打开文件一个关于 Visual Code(并希望它仍然缓存文件更改)。检查您是否在某处有文件列表,并希望您的编辑器已保存缓存副本。