如何从 Git 提交中恢复被删除的文件

53 阅读3分钟

如何从 Git 提交中恢复被删除的文件

本指南将引导您完成从特定的 Git 提交中恢复被删除文件的过程。

场景

假设您有一个文件在某个提交中被意外删除了,现在您想把它找回来。我们假设删除该文件的提交哈希是 637382ed5d8aa1ad202c887c2311ddf2444a47ad,文件路径是 docker/hive-metastore/postgresql-42.6.0.jar

常见的错误

当尝试恢复文件时,您可能会直接使用 git checkout 加上提交哈希和文件路径。让我们看看为什么这可能行不通。

1. 使用绝对路径

一个常见的错误是使用文件的绝对路径:

git checkout 637382ed5d8aa1ad202c887c2311ddf2444a47ad -- /home/user/project/docker/hive-metastore/postgresql-42.6.0.jar

这将会失败,并提示类似 error: pathspec '...' did not match any file(s) known to git 的错误。这是因为 Git 使用的是相对于项目根目录的路径,而不是您系统的根目录。

2. 使用错误的提交

即使使用相对路径,您可能仍然会遇到问题:

git checkout 637382ed5d8aa1ad202c887c2311ddf2444a47ad -- docker/hive-metastore/postgresql-42.6.0.jar

如果文件是在这个提交中被 删除 的,那么在这个提交之后,项目的文件状态中已经不存在这个文件了。git checkout 查看的是给定提交时的项目状态,所以它将无法找到该文件。

恢复已删除文件的正确方法

要恢复在特定提交中被删除的文件,您需要从删除发生 之前 的那个提交中检出文件版本。这就是父提交。

您可以通过在提交哈希后添加 ~1 来引用父提交。

正确的命令是:

git checkout <commit_hash>~1 -- <path/to/your/file>

在我们的例子中,就是:

git checkout 637382ed5d8aa1ad202c887c2311ddf2444a47ad~1 -- docker/hive-metastore/postgresql-42.6.0.jar

这个命令告诉 Git:“转到提交 637382ed5d8aa1ad202c887c2311ddf2444a47ad 的父提交,找到文件 docker/hive-metastore/postgresql-42.6.0.jar,并将其恢复到当前工作目录。”

验证

运行命令后,您应该验证文件是否已成功恢复。您可以通过列出目录中的文件来做到这一点:

ls docker/hive-metastore/

您应该会在输出中看到 postgresql-42.6.0.jar

故障排除:查找正确的文件路径

如果您不确定文件的确切路径或它是在哪个提交中被更改的,您可以使用 git show 来检查提交:

git show --name-only <commit_hash>

这将列出在该提交中更改的所有文件,帮助您验证文件路径。

通过遵循这些步骤,您可以自信地恢复从 Git 仓库中删除的任何文件。