我尝试使用Git Tower将一项更改拉入我的存储库。在此过程中发生了冲突,我错误地点击了“全部暂存”(因为我想在解决冲突后进行提交)。当我这样做时,冲突被标记为已解决。
我想手动解决更改,所以我点击了“中止合并”,但是这样做之后,所有更改都被还原了!有没有办法找回它们呢?
如果您在git中有任何已经暂存的内容,您可能可以将其找回。 (如果您只是更改了工作副本,则无法恢复它。)
首先:在继续之前备份您的存储库和工作副本。 (确保备份.git
目录。)还要避免关闭此过程发生的终端或重新启动计算机。如果失败,您有机会在历史/内存中查找材料。不要运行git gc
。
接下来,请尝试:
git fsck --lost-found
它将打印类似以下内容:
Checking object directories: 100% (256/256), done. Checking objects: 100% (30165/30165), done. dangling blob 8f72c7d79f964b8279da93ca8c05bd685e892756 dangling commit 4993502a6394491190d3f4d6fb3d1e14019c2e9b
由于您丢失了暂存文件且没有提交,因此您对dangling blob
条目感兴趣。
对于每个条目,运行git show <sha>
- 其中一些应该是您的文件。
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
git cat-file -p 8f72c7d79f964b8279da93ca8c05bd685e892756 > myFile.txt
)。针对 Alexander 给出的答案,以下是一种更简单的方法:如果你已经将修改添加到了暂存区,那么你很可能可以找回你的文件。当你运行 git add
命令时,实际上是将文件添加到 Git 的对象数据库中。在这个时候,Git 会将文件放到索引中:
改为:
补充一下 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
的更多信息。