【问题标题】:Can I get back the files in working tree which disappeared resulting from running git restore -s@ -SW?我可以取回因运行 git restore -s@ -SW 而消失的工作树中的文件吗?
【发布时间】:2021-07-09 01:28:44
【问题描述】:

我忘记将 .ai 添加到我的 .gitignore 文件中,但运行了 $ git add . 并在索引中添加了相当多的.ai 文件。

我跑的时候 $ git status 看到它们,我想将它们从索引中删除。

我匆忙跑了 $ git restore -s@ -SW 导致我所有的.ai 文件都从我的工作树中消失了。我不应该使用W

有什么方法可以找回我的.ai 文件?

【问题讨论】:

  • 如果您从未提交过它们,并且您没有备份,那么抱歉,没有。
  • @Inigo 如果他们将其添加到索引中,则它们位于对象文件夹中。如果它们从未被提交,它们仍然作为悬空对象存在。
  • @LasseV.Karlsen 我一直认为对象仅在提交时创建(存储就像内部提交)。但是想想你说的话是完全有道理的(git 怎么会跟踪索引条目?)所以我刚刚学到了一些东西。谢谢!支持 VonC 的回答 :)
  • 什么是-DW?我怀疑你曾经说过。也许你说-SW。
  • @Inigo git add 将对象添加到对象数据库。 index 是一个索引,有趣路径的对象 id。

标签: git file restore git-worktree


【解决方案1】:

首先,检查您是否仍然可以通过“本地历史记录”(由您的 IDE 记录,而不是 Git)访问这些文件

例如,Local History VSCode extension,如suggested here,可以提供帮助。

如果没有,请仔细检查您的操作系统备份功能,例如 MacOS Time Machine status,以防您可以从备份中恢复它们。

最后,既然您已将这些文件添加到索引中,check git fsck

git fsck --cache --no-reflogs --lost-found --unreachable HEAD

从列出的 SHA1 中,您可以执行 git show

git show "<SHA-1 REFERENCE TO THE BLOB OBJECT HERE>" > lost_file.txt

正如torekthe comments 中所指出的:

请注意,您还可以在 .git/lost-found/other 目录中找到每个“无法访问的 blob”的内容。

这通常比git show 更快更容易,因为您可以通过cd .git/lost-found/other,然后grep expected-string * 来查找具有预期字符串的文件。

【讨论】:

  • 天哪!我找回了丢失的文件之一。那是一个奇迹!非常感谢您的帮助,VonC !!! “show”命令比“show”做得更多!它从错误的“恢复”中得到了极大的恢复!我没想到那些文件会被找回。我发布我的问题只是为了可能有点希望。 VonC,我怎样才能至少给你买杯咖啡?
  • @ShermanChen 干得好!我已经编辑了答案以添加git show
  • VonC,您的好答案将帮助无数人!
  • @ShermanChen:请注意,您还可以在.git/lost-found/other 目录中找到每个“无法访问的 blob”的内容;这通常比git show 更快更容易,因为您可以通过cd .git/lost-found/other 然后grep expected-string * 来查找具有预期字符串的文件。
  • @torek 感谢您提供此选项。我已将您的评论包含在答案中以提高知名度。
猜你喜欢
  • 2011-10-08
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多