git重置后未暂存的文件消失--hard

dced5bon  于 2022-12-02  发布在  Git
关注(0)|答案(9)|浏览(177)

我尝试从git reflog执行git reset --hard HEAD@{n},但丢失了当前未暂存文件的所有内容:'(
未暂存的文件是我做的最后一个git add,在此之前我尝试了git reset到最后一个git commit
我的所有文件都消失了,我无法回到上次提交之前的git add:'(

83qze16e

83qze16e1#

不清楚你是丢失了工作目录中的文件,还是索引中的文件。你说你丢失了“未暂存的文件”,但你又说你可能运行了“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
(note我测试时没有得到任何丢失的树,因此这部分可能不起作用)
如果你修改了一大堆文件,通过树对象而不是单个文件可能更容易恢复

git read-tree SHA

其中SHA是根树的丢失树对象。

3bygqnnd

3bygqnnd2#

使用git reset**--hard将删除所有未暂存/未提交的文件
不建议使用--hard,因为该选项
会删除所有未登台/未提交的文件,而应该先stash**,然后使用正常重置
代替

git reset --hard HEAD@{n}

你应该做

git stash
git reset HEAD@{n}

然后,您的代码将保存在隐藏堆栈中,您可以通过执行

git stash pop

尽管这个命令将“隐藏的”更改与它们当前的HEAD合并(一个隐藏的实现类似于一个分支),但建议在生成这些隐藏的相同提交上执行隐藏检索

t9eec4r0

t9eec4r03#

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

说明:

mm5n2pyu

mm5n2pyu4#

低技术提示,这可能是有用的一些。如果未暂存/未提交的文件,你失去了,在你的编辑器中打开。尝试做撤销该文件,你应该得到“以前版本”的文件从编辑器的历史堆栈。

5cg8jx4n

5cg8jx4n5#

  • 与UsamaAmjad和Juank的答案相似 *

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

  • 在您修改过的每个文件上按Ctrl+Z,
  • 如果你幸运的话(就像我一样),你会看到一个弹出窗口,“撤销从磁盘重新加载”
  • 点击“是”。

备注:

  • 这适用于我的未登台文件
  • 我是在PyCharm中完成的,因此它可能在其他基于JetBrains/Idea的IDE中也能工作
  • 在git重置时,IDE可能需要打开
  • 在git重置时,文件可能需要在编辑器窗口中打开
xv8emn3q

xv8emn3q6#

如果有人在寻找使用PycharmIDE的解决方案,

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

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

62o28rlo

62o28rlo7#

如果你已经用git add暂存了文件,它仍然可以找到回来。但如果文件没有暂存,我不得不说没有办法。:(
请记住,git reset确实不安全,尤其是对于未暂存的文件。
但如果文件真的真的很重要,我能想到的是,你可以停止修改磁盘中的任何数据,并尝试使用finaldata等工具进行磁盘恢复。如果幸运的话,它可能会找到一些东西,因为你已经覆盖了git reset之后的一些文件。
无论如何,如果你熟悉Git,它确实是一个强大而酷的工具。

rjjhvcjd

rjjhvcjd8#

这和上面的想法非常相似,但是在我的例子中,我之前写过git status,并且在我的终端中有一个所有修改过的文件的列表,我可以从那里复制文件列表,然后在Visual Code上逐个打开文件(希望它仍然缓存了文件修改)。检查你是否在某处有文件列表,并希望你的编辑器缓存了保存的副本。

u5i3ibmn

u5i3ibmn9#

再回答一个“如果您使用的是特定的IDE...”问题...
如果您正在使用IntelliJ(或者我怀疑是任何其他JetBrains IDE),那么您可以:

  • 右键单击文件所在的文件夹
  • 选择“本地历史-〉显示历史”
  • 向下浏览“外部更改”项目,直到找到显示所有已删除文件的项目。
  • 看起来'reset --hard'在IntelliJ中显示为多个文件删除,所以列表中可能有多个'External change'。
  • 右键单击“外部更改”,然后单击“还原”

更多详情:https://blog.jetbrains.com/idea/2020/02/local-history-in-intellij-idea-may-save-your-life-code/

相关问题