如何从 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 仓库中删除的任何文件。