如何恢复使用git导致的丢失工作?

Com*_*ity 3 git git-commit atlassian-sourcetree

我正在使用SourceTree,发生的事情是我点击了"Commit",然后添加了所有已更改的文件,但在提交之前我想删除其中一个文件以便稍后提交.

我右键单击了我的文件,并提供了以下选项:

  • 去掉
  • 丢弃
  • 停止跟踪
  • 从索引中删除

在此输入图像描述

我真的对这些选择感到困惑,我点击了"丢弃",现在这个文件中完成的所有工作都丢失了!

恐慌模式!如何恢复此文件中的更改?

谢谢!

Pet*_*ren 9

如果文件已经暂存(它看起来像你的那样),那么快照将存在于Git的数据库中.我们可以把它拿回来!

Git在内部按照.git/objects/存储库中的方向存储快照.每个对象都存储在以其哈希命名的文件中,由前2个字符拆分为目录.快照将存在此处,直到它们被打包到文件中.git/objects/pack/(不会发生永远不属于提交的快照)或垃圾收集(最终将发生在您丢失的文件中).困难的部分将是弄清楚它是哪个对象.

要查找对象,请运行

ls -lRt .git/objects
Run Code Online (Sandbox Code Playgroud)

获取按上次修改时间排序的所有对象的列表.这是我的假设存储库的样子:

$ ls -lRt .git/objects

.git/objects/22:
total 4
-r--r--r-- 1 peter peter 17 Sep  1 11:18 3b7836fb19fdf64ba2d3cd6173c6a283141f78

.git/objects/f7:
total 4
-r--r--r-- 1 peter peter 17 Sep  1 11:09 0f10e4db19068f79bc43844b49f3eece45c4e8

.git/objects/54:
total 4
-r--r--r-- 1 peter peter 51 Sep  1 11:08 3b9bebdc6bd5c4b22136034a95dd097a57d3dd

.git/objects/e8:
total 4
-r--r--r-- 1 peter peter 134 Sep  1 11:08 e8417380c89509ec1e5b67c15469547a4489c2

.git/objects/e6:
total 4
-r--r--r-- 1 peter peter 15 Sep  1 11:08 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
Run Code Online (Sandbox Code Playgroud)

git cat-file -p <hash>
Run Code Online (Sandbox Code Playgroud)

候选对象,直到找到你遗失的对象.请记住将目录名称中的2个字符添加到哈希中.在我的情况下,如果我对11:09的文件感兴趣

git cat-file -p f70f10
Run Code Online (Sandbox Code Playgroud)

快乐狩猎.