在Git中,如何恢复在提交之前还原的暂存文件?

Dav*_*vid 31 git git-tower

我试图使用Git Tower将更改添加到我的存储库中.当我这样做时,发生了冲突,我错误地击中了所有阶段(因为我想在解决冲突后提交).当我这样做时,冲突标志着自己已经解决了.

我想手动解决更改,所以我点击了"Abort Merge",然而,当我这样做时,它回滚了我所有的变化!有没有办法让他们回来?

Ale*_*ysh 55

如果你有任何上演git的东西,你可能应该能够得到它.(如果您刚刚更改了工作副本,则无法恢复它.)

首先:你运行git gc.在继续之前备份您的存储库和工作副本.(确保备份.git目录.)同时避免关闭发生这种情况的终端,和/或重新启动 - 如果全部失败,您有机会在历史记录/内存中查找内容.

无论如何,首先要尝试的是:

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保留任何非承诺文件的希望.我想为那些在失物招领中找到大量垃圾的人添加小费.我有一个有100个条目,所以要找到哈希,你也可以在你的git目录中使用find-in-file类型命令,只要你能记住你写的文件的某些部分.我用过find.| xargs grep'PIECE_OF_MISSING_CODE'-sl | grep'lost-found' (4认同)

Phi*_*ppe 18

一个很晚的答案可以简化(很多?与其他答案相比)通过让您更快地找出应该恢复哪些 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
Run Code Online (Sandbox Code Playgroud)

此命令将创建一个文件,其中包含可以恢复的所有 blob 的散列和内容。

这样,您可以轻松搜索此文件并使用给定的散列(使用命令git cat-file -p 8f72c7d79f964b8279da93ca8c05bd685e892756 > myFile.txt)恢复您想要的 blob

免责声明:如果您有很多无法访问的 blob,此文件可能会变得庞大且创建速度缓慢。

在 Windows 上,GUI GitExtensions也有助于恢复文件。

  • 当我恢复 20 个左右的文件时,这非常有帮助。 (3认同)

Edw*_*son 10

使用更简单的替代方案扩展Alexander的答案:是的,如果您已经进行了更改,那么您可以将文件恢复.运行时git add,文件实际上已添加到Git的对象数据库中.在你做的那一刻,git会把文件放在索引中:

% git add bar.txt
% git ls-files --stage
100644 ce013625030ba8dba906f756967f9e9ca394464a 0   bar.txt
100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0   foo.txt
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

这些文件最终将被垃圾收集(实际上,不要显式运行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,?]: 
Run Code Online (Sandbox Code Playgroud)

git-recover在对象数据库中查找提交(或在索引中)的文件.您可以git-recover宣布它的博客文章中找到更多相关信息.