原文:How to Recover a Deleted File in Git – Revert Changes After a Hard Reset,作者:Zaira Hira

Git 是一个版本控制系统,帮助你跟踪项目生命周期中的变化。它保留了项目的历史,让你和你的团队成员在整个过程中有效地协作。

可能有这样的情况:你删除了一个文件,你想恢复它。好消息是,在使用版本控制系统(VCS)时,你可以大多数时候,可以恢复文件。

在本教程中,我们将学习 Git 提供的恢复被删除文件的不同方法。

如何在提交(commit)修改后恢复文件

假设你提交了一个修改,但做了一个硬重置(git reset --hard HEAD)到一个不同的提交,这个提交删除了你当前分支中的最新提交。

硬重置(Hard reset)的解释
硬重置(Hard reset)的解释

在这种情况下,你可以用git checkoutgit reflog来恢复文件。

你可以从命令中找到上次提交的哈希值:git log

之后,只需用以下方法恢复到之前的提交:

git checkout <hash-id>

如果你没有哈希 ID,你可以使用git reflog命令。

reflog是一种记录机制,它记录了所有的变化,并与它们唯一的hash-id相对应。

下面是一个git reflog输出的例子:

`git reflog`的输出
`git reflog`的输出

挑选提交 ID 并使用它来恢复该提交。

git reflog <hash-id>

如何在更改已进入缓存(Staged)但未提交(Committed)的情况下恢复文件

假设你用git add <file-name>暂存了一个文件,然后在提交前用git reset --hard HEAD做了一次硬重置。之后,你发现缓存的文件不见了。在这种情况下,你也可以恢复这些文件。

我们可以使用git fsck命令来恢复硬重置后的文件。

什么是 git fsk?

git fsck将进行文件系统检查。它检查.git目录中所有不属于任何修改的 悬空(dangling)的blobs。例如,可能有一些被缓存的修改(some changes that were staged),但没有被添加到任何地方。

`git fsck`的输出
`git fsck`的输出

一旦我们能够识别 dangling blobs,我们就可以用git show来查看细节。

git show f24facc98b387a375a50ba6d19193626cbfe7d45

根据不同的变化,你将能够查看对应的变化。

你可能还想把变化保存在一个文件中。你可以简单地使用>操作符将输出重定向到一个文件。

git show f24facc98b387a375a50ba6d19193626cbfe7d45 > restored_file.txt

现在,restored_file.txt将包括提交的内容。

如何恢复既未提交(Committed )也未缓存(Staged)的更改

在既没有暂存也没有提交的情况下,Git 无法帮助你恢复这些文件。

这是因为这些文件没有被添加到暂存区,Git 无法得知这些文件的状态。

在这种情况下,在临时文件或文本编辑器的缓存历史中搜索会有帮助(译者注: 如 jetbrains 开发的 IDE 的 Local History 功能)。

小结

在处理有风险的文件时,最好是使用 VCS(版本控制系统)。通过这种方式,文件将被保存下来,并减少意外数据丢失的机会。

在本教程中,我们学习了如何恢复被删除的文件,无论它们是被缓存(staged )的还是提交(committed)的。

我希望你认为本教程对你有帮助。谢谢你读到最后。

你从本教程中学到的最喜欢的东西是什么?请在推特上告诉我!

你也可以在这里阅读我的其他文章。