15

我尝试了git reset --hard HEAD@{n}from git reflog,但我丢失了当前未暂存文件的所有内容:'(

未暂存的文件是git add我做的最后一个文件,在此之前我尝试git reset了最后一个git commit.

我所有的文件都消失了,我无法回到git add上次提交之前的内容:'(

4

8 回答 8

25

目前尚不清楚您是否丢失了工作目录中的文件或索引中的文件。你说你丢失了你的“未暂存文件”,但是你提到你可能已经运行了“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 是根树的丢失树对象。

于 2014-09-11T16:07:39.067 回答
9

所有未暂存/未提交的文件将使用 git reset --hard删除

不推荐使用 --hard ,因为该选项会删除所有未暂存/未提交的文件,而是应先存储,然后使用正常重置

代替

git reset --hard HEAD@{n}

你应该做

git stash
git reset HEAD@{n}

然后将您的代码保存在存储堆栈中,您可以通过执行再次检索它

git stash pop

尽管此命令将“隐藏”更改与其当前 HEAD 合并(存储像分支一样实现),但建议在生成这些存储的相同提交上进行存储检索

于 2014-09-11T15:36:51.303 回答
8

如果有人在添加未暂存的文件之前犯了像我一样的错误git reset --hard,那么仍然有机会恢复这些更改。尽管这些文件在 repo 中不再可用,但一些新的 IDE 保留了自己的历史记录。就像在我的情况下,我能够从位于 VCS 下的 Android Studio 的本地历史记录功能中检索我未暂存的更改。

方向:

步骤1

第2步

于 2017-08-25T00:33:56.493 回答
5

可能对某些人有用的低技术提示。如果您丢失了未暂存/未提交的文件,请在编辑器中打开。尝试撤消该文件,您应该从编辑器历史堆栈中获取该文件的“先前版本”。

于 2016-03-06T08:47:35.017 回答
3

类似于 UsamaAmjad 和 Juank 的答案。

如果您使用了足够好的 IDE/编辑器:

  • 在您修改过的每个文件上按 Ctrl+Z,
  • 如果你很幸运(就像我一样),你会看到一个弹出窗口,“Undo reload from disk”
  • 点击“是”。

笔记:

  • 这适用于我的未暂存文件
  • 我是在 PyCharm 中完成的,所以它可能会在其他基于 JetBrains/Idea 的 IDE 中工作
  • 在 git reset 的时候,可能需要打开 IDE
  • 在 git reset 时,文件可能需要在编辑器窗口中打开
于 2019-04-24T04:46:45.973 回答
2

如果有人使用 Pycharm IDE 寻找解决方案,

  • 查找已删除文件的文件夹,
  • 右键单击选择,“显示历史记录”,
  • 在左侧面板中,您将看到该文件夹​​中的更改历史记录。

然后找到您删除的文件,右键单击它并选择“恢复”,然后删除的文件将出现在文件夹中。

于 2020-05-17T12:54:48.633 回答
1

如果您使用 暂存文件git add,仍然可以找到它。但如果文件没有暂存,我不得不说没有办法。:(

请记住,这git reset确实不安全,尤其是对于未暂存的文件。

但是如果这些文件真的很重要,我能想到的是,你可以停止修改磁盘中的任何数据,并尝试使用finaldata. 如果幸运的话,它可能会找回一些东西,因为您已经在git reset.

无论如何,Git如果您熟悉它,它确实是一个强大而酷的工具。

于 2014-09-11T15:42:40.040 回答
0

这与上述所有想法非常相似,但就我而言,我之前写过git status并且在我的终端中有一个所有已更改文件的列表,我可以从中复制文件列表,然后逐个打开文件一个关于 Visual Code(并希望它仍然缓存文件更改)。检查您是否在某处有文件列表,并希望您的编辑器已保存缓存副本。

于 2022-01-04T08:58:13.840 回答