题 是否有快速git命令来查看旧版本的文件?


在git中是否有一个命令可以查看(转储到stdout,或者转入 $PAGER 要么 $EDITOR)特定文件的特定版本?


1193
2017-12-03 19:31


起源


如何在git存储库中获取旧版本文件的副本? - phuclv


答案:


您可以使用 git show

$ git show REVISION:path/to/file

将REVISION替换为您的实际修订版(可以是Git提交SHA,标记名称,分支名称,相对提交名称或在Git中标识提交的任何其他方式)

例如,要查看文件的版本 src/main.c 从4个提交前,使用:

$ git show HEAD~4:src/main.c

请注意,路径来自存储库的根目录,除非它以./或../开头以指示相对路径。有关更多信息,请查看手册页 git-show


1336
2017-12-03 19:46



这实际上似乎没有用 - 你试过吗?对于“git show HEAD:path / to / file.c”,我得到一个“模糊的参数”错误。 - mike
是的,我试了一下 - 它对我有用。 - mipadi
如果你在Windows上,它可能是路径分隔符;如果我做git show HEAD:dir \ _divir \ file,我会得到一个明确的论点。如果我做git show HEAD:dir / subdir / file,它按预期工作。 - Matt McMinn
在:之后必须提供的路径来自git存储库的根目录。 (下面给出了这个答案,但我认为这是对这个答案的评论) - MatrixFrog
如果你想在Vim分割中看到它们以便它们一起滚动,我写了一个简短的 博客文章 显示如何做到这一点。 - Flaviu


按日期执行此操作如下所示:

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

注意 HEAD@{2013-02-25} 表示“此处HEAD在2013-02-25的位置”在此存储库中(使用 reflog),而不是“历史上这个分支中2013-02-25之前的最后一次提交”。


208
2018-03-07 17:05



真棒。节省我的时间,而不是去github并查看提交。 - Fizer Khan
文件路径上的“点”是我的问题。谢谢! - tomascharad
这个命令很有用 master 代替 HEAD@{2013-02-25},如果你在一个分支上 - funroll
你能把时间包括在内吗? git log --since='2016-04-28 23:59:59 +0100'? - dumbledad
这种语法使用reflog的事实很重要,应该强烈强调,因为 reflog不包含所有提交。看到 blog.endpoint.com/2014/05/git-checkout-at-specific-date.html - Alice Heaton


如果您喜欢GUI,可以使用gitk:

  1. 启动gitk:

    gitk /path/to/file
    
  2. 选择屏幕顶部的修订版,例如按描述或日期。默认情况下,屏幕的下半部分显示该修订的差异(对应于“补丁”单选按钮)。

  3. 要查看所选修订的文件:

    • 单击“树”单选按钮。这将显示该修订版本的文件树的根目录。
    • 深入查看您的文件。

98
2017-12-19 18:21



这也适用 TIG,这是一个curses git repo viewer。 - Matthew G
@Paul Slocum:可能是因为这个命令不是传统的命令,不是内置的git。我认为这个命令只适用于Windows。 - Envil
gitk在mac上工作正常(似乎是基于Tcl / Tk)。 - Trausti Kristjansson
请注意,只有从git存储库的根目录开始,这似乎才有效。 - Marc
如果你想用gitk检查某个版本,你也可以使用这个快捷方式: gitk REVISION /path/to/file。例如,当您想要检查某个版本时,这可以派上用场。 - Christian.D


您也可以指定一个 commit hash (通常也称为 commit IDgit show 命令


简而言之

git show <commitHash>:/path/to/file


一步步

  1. 显示给定文件的所有更改的日志 git log /path/to/file
  2. 在显示的更改列表中,它显示了 commit hash 如 commit 06c98... (06c98 ...是提交哈希)
  3. 复制 commit hash
  4. 运行命令 git show <commitHash>:/path/to/file 使用 commit hash第3步和第3步 path/to/file 第1步。

注意: 添加 ./ 指定相对路径时似乎很重要,即 git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html


70
2017-11-03 11:21



如果您不知道文件路径,请使用 git show <SHA1> --name-only 为拿到它,为实现它。 - Tiina
这个命令操作 - 甚至自动从内存完成 - 在已删除的目录上测试...无法获得比该gg更多的操作 - ThisGuyHasTwoThumbs
该 ./ 对我来说是必要的;谢谢。 - Anomaly


此外 Jim Hunziker的回答,

您可以从修订版中导出文件,

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

希望这可以帮助 :)


29
2018-04-30 05:07





git log -p 将不仅显示提交日志,还会显示每个提交的差异(合并提交除外)。然后你可以按 /,输入文件名并按 enter。按 n 要么 p 转到下一个/上一个发生。这样,您不仅可以看到文件中的更改,还可以查看提交信息。


13
2018-05-06 20:02



好像 git log -pm 还会显示合并提交。 - sanbor


您可以使用这样的脚本将文件的所有版本转储为单独的文件:

例如

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

得到 脚本在这里 作为另一个类似问题的答案


2
2017-10-30 17:01



git_root, git_log_short 和 git_log_message_for_commit 缺失。 - mogsie
接得好!我把这个答案翻到了两个不同的地方,然后把这一个删除了,然后链接到另一个,人们告诉我这件事之前......谢谢@mogsie! - Brad Parks