我尝试了从git reflog
中获取的git reset --hard HEAD@{n}
,结果丢失了所有当前未暂存的文件 :'(
这些未暂存的文件是我最后一次运行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
//查看其中一个对象
(master)git cat-file -p 0c29287001b29159f11c4e8a320bce7e9789c00b
changes for bar
//在这里,通过检查输出,我可以确定0c29287是文件“bar”
(master) git cat-file -p 0c29287 > bar
(注意:我在测试时没有遇到任何丢失的树对象,所以此部分可能无法正常工作)
如果您修改了许多文件,恢复整个树对象可能比单独恢复文件更容易
git read-tree SHA
SHA是根树的丢失树对象。
git cat-file -p SHA
命令之前,我应该先使用 cd
命令进入 源目录 吗? - mochadwigit reset --hard
之后,我没有在master上做任何事情,文件也消失了T__T。 - mochadwigit reset --hard
命令之前,我找到了我的另外几个 已修改 的文件,即使只有其中的三个我能够恢复,其余的文件在执行 git fsck --full --unreachable --no-reflog
后未显示。 - mochadwi使用 --hard 选项会删除所有未提交的文件,建议不要使用。
相反,您应该先使用 stash 命令,然后再使用普通的 reset 命令。这样可以避免删除所有未提交的文件。
替代方法:
git reset --hard HEAD@{n}
你应该做
git stash
git reset HEAD@{n}
您的代码将被保存在stash堆栈中,您可以通过执行以下操作再次检索它
git stash pop
尽管此命令将“存储”更改与当前HEAD合并(存储类似于分支),但建议在生成这些存储的相同提交上执行存储恢复操作。
stash
,但我不会说--hard
是“不推荐”的 - 有时您可能想要覆盖整个工作树。 - pjmorsegit reset --hard
是否会在其他分支上删除所有文件 T__T - mochadwi这是一个可能对一些人有用的低技术提示。如果您丢失的未暂存/未提交文件在您的编辑器中打开,请尝试在该文件上执行撤销操作,您应该会从编辑器的历史堆栈中获得“以前的版本”。
与UsamaAmjad和Juank的回答类似。
如果你使用的是足够好的IDE/编辑器:
注意:
git reset --hard
抹掉了,在我的情况下,使用撤销操作也能找回未暂存的更改。 - Deniz Genç如果有人在使用Pycharm IDE的过程中遇到问题,可以按照以下步骤找回删除文件:
然后找到您删除的文件,在其上单击右键,并选择“还原”,此时已删除的文件将出现在文件夹中。
git add
将文件暂存,那么它仍然可以找回。但是如果文件没有被暂存,我不得不说没有办法。:(git reset
真的不安全,特别是对于未暂存的文件。finaldata
等工具进行磁盘恢复。如果运气好的话,它可能会找回一些东西,因为你已经在git reset
后覆盖了一些文件。Git
确实是一个强大而酷的工具。git reset
之前需要考虑的高风险:)非常感谢您! - mochadwi又是一个关于“如果你正在使用特定的IDE”的答案...
如果你正在使用IntelliJ(或我怀疑任何其他JetBrains IDE),那么你可以:
更多细节: https://blog.jetbrains.com/idea/2020/02/local-history-in-intellij-idea-may-save-your-life-code/
这个想法与以上所有内容非常相似,但在我的情况下,我之前写过git status
,并在终端中列出了所有更改的文件列表,我可以从中复制文件列表,然后逐个在Visual Code上打开文件(希望它仍然有文件更改的缓存)。检查一下是否在某个地方有文件列表,并希望您的编辑器已经保存了缓存副本。
git add
来将文件添加到暂存区,那么它们就不是“未暂存”的了。但是失去未暂存的更改 - 实际上是对工作树的任何更改 - 是--hard
选项的作用。 - pjmorsegit reset --hard
的确切含义:'( - mochadwi