如何在没有第一次提交的情况下撤销git rm -rf dirname?

oalqel3c  于 2023-02-07  发布在  Git
关注(0)|答案(8)|浏览(190)

我做了:

git init
git add .
git rm -rf dirname

看看其他应答器,git reset --hard HEADgit checkout -fgit reflog不起作用,显然是因为没有HEAD可返回,也没有提交可从中获取文件。
有办法把文件拿回来吗?

efzxgjgh

efzxgjgh1#

    • 警告**:运行不带-n选项(1)的git prune将擦除您无法访问的数据。

也许有一种方法,使用git prunegit 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
  • -试运行
    不要移动任何东西;只报告它会移除什么。
mtb9vblg

mtb9vblg2#

不可能的。
通常,git rm会在删除文件之前检查文件是否已经提交,这样你就不会丢失任何工作。然而,使用-f会忽略这个检查。
简而言之:

  • 不要使用-f
  • 不要碰任何你没有承诺的东西。
q35jwt9p

q35jwt9p3#

如果你还没有提交,你可以通过执行以下操作来恢复目录:

git stash
git stash pop
git co dirname
xn1cxnb4

xn1cxnb44#

不,据我所知。我相信git会解除文件链接,就像rm -rf一样。它是否知道这些文件并不重要,它会很乐意破坏目录。真的,你唯一的办法是尝试使用文件恢复工具,就好像你 * 已经 * 完成了rm -rf一样

aiqt4smr

aiqt4smr5#

如果git没有跟踪dirname目录,它将不允许删除包含git rm -rf的目录,因为它不知道这个目录。

fatal: pathspec 'dirname' did not match any files

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

qyyhg6bp

qyyhg6bp6#

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

iyr7buue

iyr7buue7#

git stash是对我有效的命令。

vs3odd8k

vs3odd8k8#

第一种类型“git stash”
然后是“git stash pop”
之后你将看到一个删除文件的列表.复制文件名一个接一个并且使用
“git restore filename...”放弃工作目录中的更改

相关问题