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

在Git中,如何恢复提交之前还原的暂存文件?,git,git-tower,Git,Git Tower,我试图使用Git Tower将更改拉入我的存储库。当我这么做的时候,发生了冲突,我错误地击中了所有阶段(因为我想在解决冲突后做出承诺)。当我这样做时,冲突标志着它自己已经解决了 我想手动解决更改,所以我点击了“中止合并”,然而,当我这样做时,它回滚了我所有的更改!有没有办法把它们拿回来?如果你在git上做了什么,你应该可以把它们拿回来。(如果您刚刚更改了工作副本,您将无法恢复它。) 首先:不要运行gitgc。在继续之前备份存储库和工作副本。(确保备份.git目录。)同时避免关闭发生此情况的终端和

我试图使用Git Tower将更改拉入我的存储库。当我这么做的时候,发生了冲突,我错误地击中了所有阶段(因为我想在解决冲突后做出承诺)。当我这样做时,冲突标志着它自己已经解决了


我想手动解决更改,所以我点击了“中止合并”,然而,当我这样做时,它回滚了我所有的更改!有没有办法把它们拿回来?

如果你在git上做了什么,你应该可以把它们拿回来。(如果您刚刚更改了工作副本,您将无法恢复它。)

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

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

git fsck --lost-found git fsck——失物招领处 它将打印类似于

Checking object directories: 100% (256/256), done. Checking objects: 100% (30165/30165), done. dangling blob 8f72c7d79f964b8279da93ca8c05bd685e892756 dangling commit 4993502a6394491190d3f4d6fb3d1e14019c2e9b 检查对象目录:100%(256/256),完成。 检查对象:100%(30165/30165),已完成。 悬挂水滴8f72c7d79f964b8279da93ca8c05bd685e892756 悬空提交4993502a6394491190d3f4d6fb3d1e14019c2e9b 由于丢失了暂存文件并且没有进行提交,因此您对悬挂blob条目感兴趣


为每一个文件运行
git show
,其中一些应该是您的文件。

用一个更简单的替代方法来扩展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 -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的更多信息。

这是一个非常晚的答案,它可以通过让您更快地找出哪些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-p8f72c7d79f964b8279da93ca8c05bd685e892756>myFile.txt

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


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

谢谢!我已经放弃了Git保留任何未提交文件的希望。我想为那些失物招领处有很多垃圾的人补充一点建议。例如,我有100个条目,因此要查找散列,您还可以在git目录中使用find-in-file-type命令,只要您能够记住您编写的文件的某些部分。我曾经找到过xargs grep'part__MISSING_CODE'-sl | grep'lost-found'git show显示垃圾,我的意思是有一些可识别的字符串,但其余的都是垃圾。我在使用
git reset--hard
后,几乎丢失了很多重要的更改,但被GoLand iDea的本地历史功能保存了下来谢谢。你帮我省了三个星期的辛苦工作。我想知道是否有一种简单的方法可以将文件恢复到存储库中的原始路径。@jayarjo继续搜索其他文件。这意味着你正在查看的blob很可能是编译代码。请添加一条消息,说明工具和博客文章都是你的。太棒了。使用交互模式,我可以帮助我的UX团队在git合并后恢复一个文件——中止。为了帮助其他人,请使用-i,选择“f”字母并输入文件名和.extension。这在我恢复20多个文件时非常有用。