我试图使用 Git Tower 将更改拉入我的存储库。当我这样做时,发生了冲突,我错误地进入了所有阶段(因为我想在解决冲突后提交)。当我这样做时,冲突将自己标记为已解决。
我想手动解决更改,所以我点击了“中止合并”,但是,当我这样做时,它回滚了我所有的更改!有没有办法让他们回来?
如果你有任何东西上演到 git,你可能应该能够取回它。(如果您只是更改了工作副本,您将无法恢复它。)
首先:不要运行git gc
。在继续之前备份您的存储库和工作副本。(确保备份.git
目录。)同时避免关闭发生这种情况的终端,和/或重新启动——如果一切都失败了,你有机会在历史/内存中找到东西。
无论如何,首先要尝试的是:
git fsck --lost-found
它会打印出类似的东西
检查对象目录:100% (256/256),完成。 检查对象:100% (30165/30165),完成。 悬垂斑点 8f72c7d79f964b8279da93ca8c05bd685e892756 悬空提交 4993502a6394491190d3f4d6fb3d1e14019c2e9b
由于您丢失了暂存文件并且没有进行提交,因此您对dangling blob
条目感兴趣。
为每一个运行git show <sha>
——其中一些应该是你的文件。
一个非常晚的答案可以简化(很多?与其他答案相比)使用命令行进行恢复,让您更快地找出应该恢复哪些 blob:
git fsck --full --no-reflogs --unreachable --lost-found | grep blob | cut -d\ -f3 | while read in; do printf "blob: $in\n"; git cat-file -p $in; printf "\n--------------------------------\n"; done > recover.txt
此命令将创建一个文件,其中包含所有可以恢复的 blob 的哈希和内容。
这样,您可以轻松地搜索此文件并使用给定的哈希恢复您想要的 blob(使用命令git cat-file -p 8f72c7d79f964b8279da93ca8c05bd685e892756 > myFile.txt
)
免责声明:如果您有很多无法访问的 blob,则此文件可能会变得很大并且创建速度很慢。
如果您更喜欢使用 GUI 工具并且在 Windows 上,您还可以使用有助于恢复文件的GitExtensions 。
用一个更简单的替代方案扩展 Alexander 的答案:是的,如果您已经进行了更改,那么您可能可以取回您的文件。当你运行时git add
,文件实际上被添加到 Git 的对象数据库中。在您执行此操作的那一刻,git 会将文件放入索引中:
% git add bar.txt
% git ls-files --stage
100644 ce013625030ba8dba906f756967f9e9ca394464a 0 bar.txt
100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0 foo.txt
请注意,bar.txt 的条目包含文件的对象 ID。Git 实际上已将该文件添加到其对象数据库中。在这种情况下,Git 已将其作为松散对象添加到存储库中:
% ls -Flas .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
4 -r--r--r-- 1 ethomson staff 21 14 Jun 23:58 .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
这些文件最终将被垃圾收集(所以确实,不要显式运行git gc
)。值得庆幸的是,默认情况下,这将在几个月内发生,而不是几天。在这些文件被垃圾回收之前,您可以恢复它们。
最简单的方法是以交互模式下载并安装git-recover
程序:
% git recover -i
Recoverable orphaned git blobs:
61c2562a7b851b69596f0bcad1d8f54c400be977 (Thu 15 Jun 2017 12:20:22 CEST)
> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
> tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
> commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
Recover this file? [y,n,v,f,q,?]:
git-recover
在对象数据库中查找未提交(或索引中)的文件。git-recover
您可以在宣布它的博客文章中了解更多信息。