git reset --hard后,未分段的文件消失了

问题描述 投票:8回答:6

我尝试了来自git reset --hard HEAD@{n}git reflog,我用我目前的未分段文件丢失了所有内容:'(

未分阶段的文件是我做的最后一个git add,之前我尝试了git reset到最后一个git commit

我的所有文件都没了,我不能在最后一次提交之前回到git add:'(

git add reset head reflog
6个回答
14
投票

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


3
投票

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

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

代替

git reset --hard HEAD@{n}

你应该做

git stash
git reset HEAD@{n}

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

git stash pop

虽然此命令将“stashed”更改与其当前HEAD(存储类似分支实现)合并,但建议在生成这些stashes的相同提交上执行stash检索


2
投票

如果在添加非分段文件之前有人像我一样犯了git reset --hard这样的错误,那么仍然有机会重新获得这些更改。虽然这些文件在repo中不再可用,但是一些新的IDE保留了它们自己的历史记录。就像在我的情况下,我能够从Android Studio的本地历史记录功能中检索我的未分级更改,该功能位于VCS下。

路线:

Step 1

Step 2


1
投票

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

请记住,git reset确实不安全,特别是对于未分段的文件。

但是如果文件真的非常重要,我能想到的是你可能会停止修改磁盘中的任何数据,并尝试使用finaldata等工具进行磁盘恢复。如果幸运的话,它可能会找回一些东西,因为你已经在git reset之后覆盖了一些文件。

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


1
投票

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


0
投票

与UsamaAmjad和Juank的回答相似。

如果您使用了足够好的IDE / Editor:

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

笔记:

  • 这适用于我的非暂存文件
  • 我在PyCharm中这样做了,所以它可能适用于其他基于JetBrains / Idea的IDE
  • 在git重置时,IDE可能需要打开
  • 在git重置时,可能需要在编辑器窗口中打开文件
© www.soinside.com 2019 - 2024. All rights reserved.