关于Git恢复已删除的文件:Git恢复已删除的文件 – 错误的默认修订版’HEAD’


Git restore deleted files - bad default revision 'HEAD'

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

1
git init

然后我做到了:

1
git add app/controllers/*

(添加所有控制器。)

然后我决定移除这些,所以我尝试:

1
git rm app/controllers/*

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

现在,我过去几周一直在使用的所有控制器都被删除,我不知道如何将它们恢复。不幸的是,我没有其他备份,我知道这是非常愚蠢的。

我试着在谷歌上搜索。它有一些命令我试图运行,但无论我键入什么,它都会说:

bad default revision 'HEAD'.

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


假定您自最初的错误以来没有执行任何永久破坏性命令,那么您应该能够恢复文件。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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


add命令不会将文件添加到存储库中。它将文件添加到临时区域/索引。我不是你想做的,当你和他们打交道的时候。Git警告您不要提交这些文件,但随后您使用-f标志强制删除了它们,该标志也将文件从索引中删除。现在你的文件不见了。

但是,您确实将它们添加到索引中了一次,因此存储库中确实有它们的blob(假设您最近才这样做)。一个低级的解决方案是进入.git/objects目录并查找松散的对象。你会找到这样的东西。

1
2
3
4
5
6
7
8
9
10
11
{GIT_DIR!}% pwd
/tmp/bar/.git/objects
{GIT_DIR!}% tree .
.
├── 85
│   └── bfe46bc8180ef0f145d8abf946879a524df4a8
├── info
└── pack

3 directories, 1 file
{GIT_DIR!}%

现在您可以执行类似于git show 85bfe46bc8180ef0f145d8abf946879a524df4a8的操作(注意前两个字符是目录名,其余是文件名)。这将显示该blob的内容,该内容将是您的文件之一。您必须读取它并找出它是哪个文件,然后根据需要重定向输出。

我以前说过这一点。Git对用户不太友好。它是一个电动工具,所以在开始使用之前详细阅读文档是非常明智的。