如何从 git 使用中恢复丢失的工作?

4
我正在使用SourceTree,发生的情况是我点击了“提交”,然后添加了所有更改过的文件,但在提交之前我想移除其中一个文件以便稍后再提交。
我右键单击文件后,出现了以下选项:
- 移除 - 抛弃 - 停止跟踪 - 从索引中取消暂存
我对这些选项感到很困惑,我选择了“抛弃”,结果所有在这个文件中做的工作都消失了!!!
紧急模式!我该如何恢复这个文件中的更改?
谢谢!

2
很不幸,我认为你真的丢失了这些更改。我不是“sourcetree”的用户,但我希望“Discard”会放弃你的更改。现在,如果你在IDE中启用了某种独立于Git的“本地历史记录”,那么你可能可以通过这种方式检索你的更改。我知道Intellij IDEA默认启用了这个功能。不确定Eclipse或其他工具是否有这个功能。如果你没有这个功能,那么你应该考虑一下。它非常好用,可以提供额外的安全层 - 它也比git提交更细粒度。 - Steinar
哇,这真的很可怕!我一开始使用Git是为了避免数据丢失,现在却陷入了绝境!顺便说一下,我正在使用Netbeans(大多数是默认设置),有没有可能从那里恢复我的工作? - Community
1
我不熟悉NetBeans,但是快速谷歌搜索显示它确实有“本地历史记录”功能。你应该去查一下。例如,看看这篇文章:http://humansky.com/2012/05/netbeans-local-history-to-the-rescue/ - Steinar
2
哦,Git是一个非常好的工具,但在你提交数据之前,它无法帮助你找回数据。每个源代码管理工具都有丢弃当前工作并恢复到已提交到仓库的状态的方法。因此,当你开始使用新的源代码管理工具时,应该花一些时间用测试仓库来熟悉它。 - Steinar
2
@usernotfound:从索引中取消暂存可能是你想要的操作 -- 在git中,'索引'是你即将提交的文件集合。 - Chris Dodd
显示剩余5条评论
3个回答

14
如果文件已经被暂存(看起来你的文件是这样的),Git数据库中将存在一个快照。 我们可以找回它!
Git在存储库的.git/objects/目录中内部存储快照。每个对象都以其哈希命名的文件中存储,由前2个字符拆分为目录。 快照将一直存在,直到它们被打包成.git/objects/pack/中的文件(对于从未包含在提交中的快照不会发生此情况),或者垃圾回收对其进行处理(最终会发生在你丢失的文件上)。 最困难的部分将是确定它是哪个对象。
要查找对象,请运行:
ls -lRt .git/objects

获取按最后修改时间排序的所有对象列表。以下是我的假设存储库的样子:

$ 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

运行

git cat-file -p <hash>

在候选对象中找到你缺失的对象,记得将目录名中的2个字符添加到哈希值中。在我的情况下,如果我对来自11:09的文件感兴趣。

git cat-file -p f70f10

愉快的狩猎。


1
谢谢您的回复,但是有成千上万的对象,手动查找特定文件的唯一状态似乎是不可能的...也许需要一个好的搜索工具来提供可视化结果...这样的工具存在吗? - Community
我原本希望时间戳足够了。话虽如此,git-fsck(1) 肯定可以在这里提供帮助。试试 git fsck --lost-found 是否需要更少的工作来筛选。 - Peter Lundgren

1
在Netbeans中,我成功地使用它的历史选项来恢复Sourcetree删除的文件。如果你右键点击项目并转到历史记录,有一个还原已删除文件的选项。我知道这个问题有点旧了,但希望这可以帮助其他遇到同样问题的人。

0
在 SourceTree 中 - 假设您有一些文件的提交历史记录,您可以通过以下两种方式之一,在“删除”文件后恢复部分或全部工作:
1)在“暂存索引”区域或“工作树”区域中选择文件。在详细信息窗口中,SourceTree 将向您显示整个文件(因为您已将其删除,所以其整个内容都已“更改”)。然后,您可以将该窗口的整个内容复制/粘贴到文本编辑器中,并将文件插入回您的工作副本中。
2)在“暂存索引”或“工作树”区域中选择文件,右键单击以访问“重置到提交”功能。然后,您选择要将该文件还原到哪个提交,并单击“确定”。

嗨,Fabrice,感谢您的回答。不幸的是,这并没有完全解决问题,因为我没有丢失文件,我只是丢失了对该文件所做的最新更改 - 这就是我正在尝试恢复的内容。此外,如果有任何SourceTree开发人员正在阅读此内容,我建议SourceTree显示一个警告,清楚地说明正在“丢弃”什么,并且此操作是明确且不可逆转的。最佳的用户体验/解决方案是通过添加“撤消”按钮来取消软件中采取的任何操作。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接