12

我做了:

git init
git add .
git rm -rf dirname

查看其他答案,git reset --hard HEADgit checkout -f没有git reflog工作,显然是因为没有 HEAD 可以返回,也没有提交来获取文件。

有没有办法找回文件?

4

7 回答 7

11

警告git prune不使用-n选项 (1)运行将删除您无法访问的数据。

可能有一种方法,使用git pruneand git cat-file

运行git prune -n将列出哪些对象将通过修剪被删除:

$ git prune -n
9cc84ea9b4d95453215d0c26489d6a78694e0bc6 blob
c315143703752ef4d11ca7d93f2c324872b2ebff blob

每行对应一个已删除的文件。

现在,使用git cat-file,我们可以将已删除文件的内容恢复为新文件:

git cat-file -p 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 > restored-filename

(1)来自git prune文档:

名称
git-prune - 从对象数据库中修剪所有无法访问的对象

OPTIONS
-n
--dry-run
不要删除任何东西;只需报告它将删除的内容。

于 2017-11-14T11:30:09.243 回答
10

没有办法。

通常,git rm在删除文件之前检查文件是否已经提交,这样您就不会丢失任何工作。但是,使用-f会覆盖此检查。

简而言之:

  • 不要使用-f.
  • 不要碰任何你没有承诺的东西。
于 2012-03-10T05:17:10.413 回答
2

不,据我所知。我相信 git 会取消链接文件,就像 do 一样rm -rf。它是否知道文件并不重要,它会很乐意对目录进行核对。真的,您唯一的办法就是尝试使用文件恢复工具,就好像您已经完成了一样rm -rf

于 2012-03-10T05:16:16.157 回答
2

如果 git 没有跟踪dirname目录,它不会允许你删除目录,git rm -rf因为它不知道它。你会(会)得到一个错误,比如

fatal: pathspec 'dirname' did not match any files

你可以删除的唯一方法是如果你做了一个git add .git add dirname之后git init。如果是这种情况,您的文件就消失了,并且您无法取回它们,因为它从未提交过并且 git 不会跟踪它。它与在普通文件夹上执行操作一样好rm -rf(除非您有备份,否则无法恢复)

于 2012-03-10T05:17:49.327 回答
2

如果您尚未提交,您可以通过执行以下操作恢复目录:

git stash
git stash pop
git co dirname
于 2020-06-09T23:06:31.370 回答
1

git reset --hard在尚未提交删除时有所帮助,一般来说,删除被Ctrl+Z

于 2015-12-04T14:53:50.530 回答
0

git stash是对我有用的命令。

于 2021-09-07T16:13:03.350 回答