恢复git索引更改丢失

时间:2014-05-09 14:35:38

标签: git

我的git分支可能处于不良状态(也许是不完整的rebase),我不知道。我做了一些改变然后想要提交,但是git抱怨说你处于挑选状态,所以它无法提交。我用谷歌搜索,发现如果我对一个远程分支进行reset --hard,它会把我带出坏的git状态。在此之前,我已在暂存区域中添加了我的更改(使用git add)。但当我git reset --hard时,我的临时区域消失了。我找不到我的索引文件和更改。有没有办法恢复索引?

1 个答案:

答案 0 :(得分:2)

当您git add文件时,它会将该文件添加到对象数据库并将对象信息放在暂存区域中。如果要随后从暂存区域中删除该文件,则会从索引中仅删除 。该文件将保留在对象数据库中,直到它被垃圾回收。你可以找到这些"悬挂"文件使用git fsck

例如:

如果我创建一个新文件并git add它到我的临时区域:

% echo "new file" > newfile.txt
% git add newfile.txt
% git ls-files --stage
100644 40ee2647744341be918c15f1d0c5e85de4ddc5ed 0       file.txt
100644 3748764a2c3a132adff709b1a6cd75499c11b966 0       newfile.txt

然后重置为HEAD,请注意newfile.txt消失:

% git reset --hard HEAD
% git ls-files --stage
100644 40ee2647744341be918c15f1d0c5e85de4ddc5ed 0       file.txt

但是,运行git fsck会向我显示未在我的图表中生根的对象,即"悬空"要么因为提交不是分支的一部分(也许我重写了它们)和它们引用的对象,要么是因为我git add编辑了一个文件并且没有提交它。我的newfile.txt将在其中:

% git fsck
Checking object directories: 100% (256/256), done.
dangling blob 3748764a2c3a132adff709b1a6cd75499c11b966

不幸的是,它的文件名没有存储在对象数据库中(因为相同的内容无论名称都有相同的对象),所以如果你有许多悬空blob,你将不得不检查每一个:

% git show 3748764
new file

一旦我确定了要恢复的悬挂blob,我可以通过重定向git show将其重新放回文件系统:

% git show 3748764 > newfile.txt

文件已恢复!