在Git中查看已删除的文件

126

我使用Git删除了一个文件然后进行了提交,因此该文件不再在我的工作副本中。我想查看该文件的内容,但不想实际恢复它。我该如何做?

4个回答

172
git show HEAD^:path/to/file

您可以使用明确的提交标识符或HEAD~n来查看旧版本,如果自您删除以来进行了多次提交。


8
请注意,path/to/file 是从项目顶部(仓库的顶级目录)开始的完整路径。 - Jakub Narębski
3
我遇到了 fatal: Invalid object name 'HEAD^'. 的错误(需要说明的是,我只有一个“Initial commit”)。 - vladkras
1
如果删除是分阶段的但未提交,请使用HEAD而不是HEAD^(因为它存在于HEAD中)。例如,我认为我需要一个文件,所以我添加了它并提交以保存我的工作,然后当我想到另一种解决方案时再将其删除。要查看再次提交之前的原始文件,我执行了git show HEAD:path/to/file。 - Tony Wickham
6
值得一提的是,这仅适用于文件在最近一次提交中被删除的情况。如果文件在数个提交之前被删除,您将需要使用其他答案中的方法。 - jayhendren

69

如果您删除了一段时间并且不想寻找修订版的文件,则可以使用(在此示例中,文件名为foo,您可以使用完整路径):

git show $(git rev-list --max-count=1 --all -- foo)^:foo
rev-list命令查找foo的所有修订版本,但只列出其中一个。由于rev-list按照时间倒序列出列表,所以它列出的是最后一个更改了foo的修订版本,也就是删除foo的提交。 (这基于git不允许已删除的文件被更改但仍保持已删除状态的假设。)您不能直接使用rev-list返回的修订版本,因为foo在其中已不存在,您必须请求其之前的修订版本,其中包含该文件的最后一个修订版本,因此在git show中使用^

2
你可能需要将最后一个 foo 改为 ./foo。对于不使用 bash 的人,可以使用命令 "git rev-list --max-count=1 --all -- foo" 获取 ID,然后使用该 ID(524.. 是 ID)执行命令 "git show 5824127a8d99576632a04ac2b5c2344bcf751967:./foo"。 - Dror
1
好的回答。我不得不使用~而不是^。不确定为什么。并且只是为了让人们清楚,这里的“foo”必须是从git根目录开始的完整路径。 - pedorro
如果您不知道路径,可以编写 **/foo(这适用于 rev-list 命令,但不适用于 show 命令。但是,使用来自 rev-list 命令的提交,您可以找到路径)。 - Nickolai
截至本评论日期,使用 ^git showgit log 不起作用。 必须使用 git log -p~ 才能使其正常工作。 - tamato

11

如果您可能不记得确切的路径,您可以从Git日志中获取sha1值,然后简单地执行:

 git cat-file -p <sha1>

5
代表Samuel Slund:找到上面使用的sha1总和的一种方法是:git whatchanged --no-abbrev,它会给出类似于git(或svn)日志的输出。 - artless noise

1

以下是一种方法,即使您不记得确切的名称和/或路径,也可以找到很久以前删除的文件:

git log --stat=1000 --full-history -- "**/*partial_file_name*.*"

  • --stat=1000 列出提交中的所有文件。 1000 确保您将看到删除文件的整个相对路径https://dev59.com/DGkv5IYBdhLWcg3wpCQz#10460154
  • --full-history 显示文件的反向提交历史记录,从删除提交开始。

这样,您还可以通过扫描消息和历史记录搜索特定提交中的特定文件版本。

使用提交哈希,您可以查看文件:

git show COMMIT_HASH:entire/relative/path/to/deleted_file_name.ext

正确获取相对路径非常重要,否则Git会告诉您找不到该路径。此外,在实际文件删除提交之前,您必须使用提交哈希值,这将无法显示任何内容,因为 git show会向您显示该提交中文件的版本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接