我做了:
git init
git add .
git rm -rf dirname
查看其他答案后,git reset --hard HEAD
、git checkout -f
和git reflog
都没有起作用,显然是因为没有HEAD可以返回,也没有提交可以从中恢复文件。
有没有办法拿回这些文件?
我做了:
git init
git add .
git rm -rf dirname
查看其他答案后,git reset --hard HEAD
、git checkout -f
和git reflog
都没有起作用,显然是因为没有HEAD可以返回,也没有提交可以从中恢复文件。
有没有办法拿回这些文件?
警告: 在不使用 -n
选项(1)的情况下运行 git prune
将会擦除您无法访问的数据。
可能有一种方法,可以使用 git prune
和 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 - 从对象数据库中清除所有无法访问的对象
选项
-n
--dry-run
不要删除任何东西; 只报告它将要删除什么。
git rm -rf .
来撤销一次更改。我当时真的以为所有的工作都永远丢失了。给未来的自己的提示 - 总是从空仓库开始,然后随着进展逐步添加文件! - giran无路可走。
通常,git rm
在删除文件之前会检查它们是否已经提交,以便不会丢失您的工作内容。然而,使用 -f
会覆盖此检查。
简而言之:
-f
。-f
选项一样,这意味着你需要非常确定自己在做什么。 - B Seven如果您尚未提交,可以通过执行以下操作来恢复目录:
git stash
git stash pop
git co dirname
dirname
目录,它将不允许您使用git rm -rf
删除该目录,因为它不知道该目录的存在。您将(可能)会收到以下错误消息:fatal: pathspec 'dirname' did not match any files
如果您在git init
之后执行了git add .
或git add dirname
,则唯一的删除方式是这样的。如果是这种情况,您的文件已经被删除了,因为它从来没有被提交,Git也不会跟踪它。这就像在普通文件夹上执行rm -rf
一样(除非您有备份,否则无法恢复)。
-f
,否则会“覆盖最新检查”,不管那意味着什么。 - B Sevengit rm
中的-f
仅用于覆盖最新检查。 - manojldsgit rm -rf
不会触及未暂存的目录,但它会愉快地清除已暂存但未提交的目录。 - Lambda Fairygit reset --hard
在删除操作尚未提交时有所帮助,一般来说,删除操作被 Ctrl+Z
打断了。
git stash 是对我有效的命令。
首先输入 "git stash"
然后输入 "git stash pop"
接着你会看到一个已删除文件的列表。逐个复制文件名并使用
"git restore 文件名..." 来放弃工作目录中的更改