git add + git reset 硬删除工作副本文件 - 撤消?

标签 git git-reset

我用 git add 添加了一个目录,发现里面有错误的文件,所以我使用 git reset --hard 回到最新的提交,但我不知道 git 也会删除那些添加的文件在工作副本中。

有谁知道我如何撤消此操作?

最佳答案

当您git add 一个文件时,它会被添加到对象数据库和索引中。运行 git reset 更新了索引和工作目录,但并未从对象数据库中删除这些文件。它们仍然是无根(“悬挂”)对象。您可以运行 git 文件系统检查器 git fsck 来查看哪些项目“悬空”。您应该会看到如下报告:

% git fsck
dangling blob 1ff0c423042b46cb1d617b81efb715defbe8054d
dangling blob 1bc915c5cb7185a9438de28a7b1a7dfe8c01ee7f
dangling blob a8c86221b400b836010567cc3593db6e96c1a83a
dangling blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e
dangling blob 21a96a98ed84d45866e1de6e266fd3a61a4ae9dc
... etc ...

如果您碰巧也有悬空树,则可以将文件名恢复为 blob ID 映射。如果你有一些悬垂的树:

dangling tree 57623d711c18d819831f24a9456f0660e9dbe596

然后你可以通过运行 git ls-tree 命令来显示树的内容:

% git ls-tree 57623d711c18d819831f24a9456f0660e9dbe596
100644 blob 21a96a98ed84d45866e1de6e266fd3a61a4ae9dc file1.txt
100644 blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e file2.txt

这表明 blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e 最初添加为 file1.txt。但是,很可能您没有将树添加到对象数据库中,您将需要检查每个文件以确定要将其保存在何处。

您可以使用 git cat-file 命令获取 blob 的内容。例如,将其保存到 recovered.bak:

% git cat-file blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e  > recovered.bak

关于git add + git reset 硬删除工作副本文件 - 撤消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21197545/

相关文章:

git - 在同一 svn-remote 中初始提取后添加 git 分支

git - 如何按最近 checkout 对 git branch 的输出进行排序

git - git reset --hard origin/master 是什么意思?

git-commit - 恢复在主线上意外提交的更改,回到 git 上主存储库中的内容

GIT如何将文件权限更改为775(而不是755)?

git - Pull Request,忽略一些文件更改

javascript - 从 Git 子模块存储库导入 React 组件

git - 'reset hard head' 和 'reset hard' 有什么区别?

git - 将现有的、未提交的工作移动到 Git 中的新分支

git - 转到上一个提交,进行更改并作为新头提交