我通过git add *
在登台索引中添加了一堆更改,但尚未提交,我想删除它们,撤消添加,因此,我确实git rm -rf .
感到惊讶,它将它们从硬盘驱动器中删除了,我想找到一种方法将它们取回;但是,我已经进行了很大的更改,并且我想找回这些更改。
TLDR::我通过git rm -rf .
删除了整个项目,我需要某种方式来重置删除,以便保留未提交的更改并取回文件。请我太害怕了,我可能会失去我的整个项目。
答案::我的存储库基本上是一个包含很多内容的网站,根据以下答案,我制作了2个副本,分别称为副本A和副本B,因为AI git reset --hard
返回最新的提交,我恢复了文件,但是丢失了对它们所做的更改。因此,对于BI,它做了git fsck --lost-found
,并进入了.git / lost-found / other /目录,该目录包含我文件的多个以哈希命名的版本,我一直打开每个文件,它们分别是60个文件btw ,我识别出的每个文件都将其重命名为真实名称,然后将其替换为副本A内的旧版本,最后,我删除了原始存储库,现在使用副本A作为我的网站。认为现在什么都没发生。一个小小的愚蠢错误=> 5小时的痛苦。永远不要重复我所做的事情。
现在git status
将我的所有文件显示为“已删除:”,并以绿色显示。
答案 0 :(得分:4)
使用
find .git/objects/ -type f -printf "%T+\t%p\n" \
| sort \
| sed 's:.*git/objects/\(.*\)/\(.*\):\1\2:' \
| while read object; do
echo -n "$object ";
git cat-file -t "$object";
done
您应该获得按时间顺序排列的对象和类型的列表。
例如,在测试仓库中:
908553f63e9126f933b690970d41adc3377e3360 blob
31e0d0e213c9976308fbb91c542ced9218fa8f6a tree
5b181f91c49d287b4670fcf3545656dc0c0ef5f4 commit
de683137e0b2d0a40f766307e81999986e4b31c2 blob
086cb344a4fd8a9d671006b8e5844f2437faa3ab tree
930ba9809b5d50410b72c3fbff111d948f1027fa commit
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 blob
40cda8e010466dc7a4a0eb107e7e45804290685e blob
最后两个Blob是在最后一次提交之后创建的,如果您使用例如来打印它们。 git cat-file -p 40cda8e010466dc7a4a0eb107e7e45804290685e
,您应该能够恢复文件内容。
您还可以通过这种方式获得一些树(使用git ls-tree <tree-id>
进行打印),而不是顶级树,因为它直接存储在索引中。
答案 1 :(得分:3)
对于已提交的文件,git reset --hard
将全部恢复。
对于已添加但未提交的内容,请尝试git fsck --lost-found
。它将打印悬挂的Blob,并将其副本复制到.git/lost-found/other
中。您可以运行git cat-file -p $blob
或cat .git/lost-found/other/$blob
来查看内容。这些blob不会记录文件路径,因此您需要按内存或未使用git grep $keyword
重新修改的关键字来映射内容和文件路径。找到斑点的路径后,运行cp .git/lost-found/other/$blob $path
对其进行恢复。
答案 2 :(得分:3)
可能会有希望:您先前添加到索引中的对象可能仍然存在,尽管它们不再被引用。我做了以下测试:
$ git init test
$ cd test
$ echo hello > README.md
$ git add README.md
$ git commit -m"Add README.md"
$ echo world >> README.md
$ cat README.md
hello
world
$ git add README.md
$ git rm -f README.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: README.md
$ git fsck
Checking object directories: 100% (256/256), done.
unreachable blob 94954abda49de8615a048f8d2e64b5de848e27a1
$ git show 94954abda49de8615a048f8d2e64b5de848e27a1
hello
world
因此,即使在git rm -f
之后,添加到索引的文件内容仍然存在。您可以通过运行.git/lost-found/other
将它们全部转储到git fsck --lost-found
中。
索引本身并不存储为Git对象,而是直接驻留在.git/index
中,因此我认为它已被不可逆地覆盖。这意味着文件的路径以及所有元数据(例如权限)都已丢失。
答案 3 :(得分:0)
正如评论者所说,您应该做的第一件事就是备份您的项目目录。
您可以使用git reset --hard HEAD
取回已提交的文件。由于您清除了暂存树,因此您尚未提交的更改不再存在于git中(如其他答案所指出的,这可能不正确),因此恢复它们的唯一机会就是您或操作系统可能进行的任何备份。
很抱歉,这对当前情况没有帮助,但是您可以使用git reset HEAD
撤消更改,以备将来参考。
答案 4 :(得分:0)
git status
为您提供了有关可用于恢复文件的命令的一些提示:
$ git rm -rf .
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: file1
deleted: file2
要取消转储已删除的文件,请执行以下操作:
$ git reset HEAD file1 file2
$ git status
On branch master
Your branch is up to date with 'origin/master'.
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: file1
deleted: file2
no changes added to commit (use "git add" and/or "git commit -a")
签出已删除的文件:
$ git checkout -- file1 file2
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean