如何撤消“git rm -r -f *”

时间:2013-07-21 11:08:25

标签: git git-rm

我第一次使用git, 我有一个目录,里面写着几个程序,并执行了以下步骤

  1. 我做了git add .
  2. 然后git commit,然后我收到了一条消息Aborting commit due to empty commit message.
  3. 然后我想,让我在共同信息下提交一组文件。所以我想删除所有添加的文件。
  4. 所以我做了git rm -r -f
  5. 当我执行ls时,我丢失了所有代码。有什么方法可以让他们回来,我的愚蠢甚至没有备份副本。
  6. 我到目前为止所遵循的事情

    我用Google搜索了一些发现的命令,但是他们没有工作

    git stash如果我输入此命令,我会

      

    致命:糟糕的修改'HEAD'   致命:糟糕的修改'HEAD'   致命:需要一次修订   您还没有初始提交

    git reset HEAD,如果我输入此命令,我会

      

    致命:模棱两可的争论'HEAD':未知版本或路径不在   工作树。   使用' - '将路径与修订分开

    我真的需要恢复这些文件!

    我创建GIT的步骤

    1. mkdir BareRepo
    2. BareRepo目录中我做了git initgit statusgit config --bool core.bare true
    3. 然后我克隆了BareRepo git clone BareRepo/ Programs/
    4. Programs目录中,我做了上述所有事情

2 个答案:

答案 0 :(得分:6)

可能能够从中止提交中恢复文件

基于对@ the-malkolm的观察。

根据问题中的信息,没有提交,并且不会随时跟踪文件。因为这样的git并不真正知道任何已被删除的文件。

然而,那说,有希望。只是因为你试图在删除它们之前提交文件,所以有一个幻像提交在其中包含所有文件。

以下是一个例子:

$ git init
Initialised empty Git repository in /tmp/so/.git/
$ echo "find this text" > README.md 
$ git add README.md 
$ git commit -v 
Aborting commit due to empty commit message.
$ git rm -rf .
rm 'README.md' 
$ git status
# On branch master
# 
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

以上模拟了问题中的事件,通常这是重新开始重写代码的时间。没有提交,文件消失了。

确定中止提交

但是,检查.git存储库会产生一些信息:

$ tree .git/objects/
.git/objects/
├── 91
│   └── 9cdf847a6af7c655c8de1d101385f47f33e0f9
├── d6
│   └── 7d51abe2521dcd00cec138b72f5605125c1e41
├── info
└── pack

尽管没有提交,但git存储库中有对象。有必要确定两个对象中的哪一个是tree

$ git ls-tree 919cdf
fatal: not a tree object
$ git ls-tree d67d51
100644 blob 919cdf847a6af7c655c8de1d101385f47f33e0f9    README.md
$

第一个引用是表示README.md文件的blob - 存储库中每个文件将有一个blob,本例中的第二个是树引用。

重新创建工作副本

识别出树形哈希后,可以使用read-tree重建索引:

$ git read-tree d67d51abe2521dcd00cec138b72f5605125c1e41
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   README.md
#
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    README.md
$

此时,工作副本为空,但丢失的文件将暂停提交

提交他们:

$ git commit -m "phew"

结帐以匹配存储库的已提交状态:

$ git checkout .
$ ls
README.md  

然后,所有文件都存在且已经提交。

答案 1 :(得分:-4)

我不确定这会100%有效,但我认为值得一试:

git reflog是你的命令

reflog记录你在git中执行的每一个动作......所以我打赌这个。

reflog将生成您在repo上执行的命令列表

要恢复您的工作,请浏览reflog生成的日志并执行操作 git reset --hard HEAD@{<x>}

..用x替换定义你想要的状态的数字......

....应该将你的回购重置回原状态(希望如此)