4

我第一次使用 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”致命:错误的修订版“HEAD”致命:需要单个修订版您还没有初始提交

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

致命:模棱两可的参数“头”:未知的修订或路径不在工作树中。使用 '--' 将路径与修订分开

我真的需要找回那些文件!

我创建 GIT 所遵循的步骤

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

2 回答 2

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 存储库中有对象。有必要确定两个对象中的哪一个是

$ 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  

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

于 2013-07-21T14:56:55.507 回答
-4

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

git reflog是你的命令

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

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

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

.. 替换x为定义您想要处于的状态的数字...

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

于 2013-07-21T14:41:48.977 回答