Git恢复已删除的文件 - 错误的默认修订版'HEAD'

时间:2014-11-19 03:13:31

标签: git

我刚开始使用git。我运行了命令:

git init

然后我做了:

git add app/controllers/*

(添加所有控制器。)

然后我决定删除那些,所以我尝试了:

git rm app/controllers/*

这给了我一个错误,说有一些未保存的更改或其他内容,所以我不得不使用-f标志来强制删除。现在知道我在做什么,我重新输入了命令: git rm -f app/controllers/*

现在,我过去几周一直在处理的所有控制器都被删除了,我不知道如何让他们回来。不幸的是,我没有其他支持,我知道这是非常愚蠢的。

我试着在Google上寻找。它有一些我试图运行的命令,但无论我输入什么它都说:

  

bad default revision 'HEAD'.

任何恢复过去几周工作的帮助都会非常感激!

2 个答案:

答案 0 :(得分:2)

假设您没有完成任何永久性破坏性命令,因为您最初的错误应该能够恢复您的文件。

然而,您无法恢复的是文件的名称。 Git将存储内容,但不存储路径/名称。

因此,使用git fsck查找悬空blob,然后cat结果输出并将内容重定向到新文件。

me@myvm:/scratch $ mkdir rmtest
me@myvm:/scratch $ cd rmtest
me@myvm:/scratch/rmtest $ mkdir app
me@myvm:/scratch/rmtest $ cd app
me@myvm:/scratch/rmtest/app $ mkdir controllers
me@myvm:/scratch/rmtest/app $ cd controllers 
me@myvm:/scratch/rmtest/app/controllers $ echo "2 weeks worth of work" > foo
me@myvm:/scratch/rmtest/app/controllers $ cd ../../
me@myvm:/scratch/rmtest $ git init
Initialized empty Git repository in /scratch/rmtest/.git/
me@myvm:/scratch/rmtest  (master)$ git add app/controllers/*
me@myvm:/scratch/rmtest  (master)$ git rm app/controllers/*
error: the following file has changes staged in the index:
    app/controllers/foo
(use --cached to keep the file, or -f to force removal)
me@myvm:/scratch/rmtest  (master)$ git rm -f app/controllers/*
rm 'app/controllers/foo'
me@myvm:/scratch/rmtest  (master)$ ll
total 0
me@myvm:/scratch/rmtest  (master)$ git fsck 
notice: HEAD points to an unborn branch (master)
Checking object directories: 100% (256/256), done.
notice: No default references
dangling blob f9a0e5002ae9f9a854ecf50560c40b3b0a7ec7bc
me@myvm:/scratch/rmtest  (master)$ git cat-file -p f9a0e5002ae9f9a854ecf50560c40b3b0a7ec7bc
2 weeks worth of work

答案 1 :(得分:1)

add命令不会将文件添加到存储库中。它将文件添加到暂存区/索引。当你rm给他们时,我不是你想要做的。 Git警告你他们没有被提交,但是你使用-f标志强制删除它们,这也会从索引中删除文件。现在你的文件消失了。

但是,您确实将它们添加到索引中,因此存储库确实为它们添加了blob(假设您最近刚刚完成此操作)。低级解决方案是进入.git/objects目录并查找松散的对象。你会发现这样的事情。

{GIT_DIR!}% pwd
/tmp/bar/.git/objects
{GIT_DIR!}% tree .
.
├── 85
│   └── bfe46bc8180ef0f145d8abf946879a524df4a8
├── info
└── pack

3 directories, 1 file
{GIT_DIR!}%            

现在你做了git show 85bfe46bc8180ef0f145d8abf946879a524df4a8之类的事情(注意前两个字符是目录名,其余的是文件名。这将显示该blob的内容,它将是你的一个文件。你&# 39; ll必须读取它并确定它是哪个文件然后根据需要重定向输出。

我之前已经说过这一点。 Git不是非常用户友好。它是一种电动工具,因此在您开始使用之前详细阅读文档是非常明智的。