【问题标题】:How to undo a " git rm -r -f * "如何撤消“ git rm -r -f * ”
【发布时间】:2013-07-20 05:59:31
【问题描述】:

我是第一次使用 git, 我有一个目录,里面有几个程序,并做了以下步骤

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

到目前为止我一直关注的事情

我用谷歌搜索了一些发现的一些命令,但它们不起作用

git stash 如果我输入这个命令,我会得到

致命:错误的修订版“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 目录中我做了上述所有事情

【问题讨论】:

标签: git git-rm


【解决方案1】:

也许能够从中止的提交中恢复文件

基于@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
$

第一个引用是 blob 代表 README.md 文件 - 存储库中的每个文件都有一个 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  

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

【讨论】:

  • 原发布者可以尝试从磁盘恢复已删除的文件,但不能通过 Git。也许他应该尝试在Super User上询问如何做到这一点。
  • 如果有任何东西被添加到暂存区域,那么在运行 git-gc 之前它仍然在仓库中。
  • @the.malkolm 那.. 是一个很好的观点,要去调查。
  • git cherry-pick $(echo "recovered" | git commit-tree d67d51abe2521dcd00cec138b72f5605125c1e41)
  • 上述步骤仅适用于执行提交的结帐和git rm -rf .。如果您再次克隆,对象将不存在 在该结帐中 被发现。
【解决方案2】:

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

git reflog 是你的命令

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

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

要恢复您的工作,请查看 reflog 生成的日志并执行 git reset --hard HEAD@{&lt;x&gt;}

.. 将x 替换为定义您希望处于的状态的数字...

....这应该将您的回购重置为原始状态(希望如此)

【讨论】:

  • 原始发布者尚未在他的 repo 中进行任何提交,因此这不起作用。
猜你喜欢
  • 2015-08-05
  • 2022-01-17
  • 2012-11-21
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2015-03-14
  • 2014-04-10
  • 1970-01-01
相关资源
最近更新 更多