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