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

mik*_*ike 1438 git

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

mip*_*adi 1643

你可以使用git show:

$ git show REVISION:path/to/file
Run Code Online (Sandbox Code Playgroud)

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

例如,要查看./4次提交前的文件版本,请使用:

$ git show HEAD~4:src/main.c
Run Code Online (Sandbox Code Playgroud)

请注意,路径来自存储库的根目录,除非它以./或../开头以指示相对路径.即使在相对于当前目录的路径中,Git for Windows也需要正斜杠.有关更多信息,请查看手册页../.

  • 是的,我试了一下 - 它对我有用. (34认同)
  • 如果你在Windows上,它可能是一个路径分隔符; 如果我做git show HEAD:dir\_divir\file,我会得到一个明确的论点.如果我做git show HEAD:dir/subdir/file,它按预期工作. (17认同)
  • 在:之后必须提供的路径来自git存储库的根目录.(这在下面作为答案给出,但我认为这是对这个答案的评论) (12认同)
  • 如果你想在Vim中看到它以便它们一起滚动,我写了一篇简短的[博文](http://readncode.com/blog/view-old-git-version-of-a-file-in -a-vim-split /)显示如何做到这一点. (9认同)
  • 这实际上似乎没有用 - 你试过吗?对于"git show HEAD:path/to/file.c",我得到一个"模糊的参数"错误. (5认同)
  • 必须是完整的路径,从git repo的顶部 (2认同)
  • 您还可以使用`(commit):(文件路径)|将git show重定向到vim vim -`.我发现这比使用默认使用的更少/更多更好. (2认同)
  • 添加到答案 - git-show 不会给你行号。如果您想要行号,请尝试 `git show <commit>:<file> | 少-N` (2认同)
  • 如果您以“.”开头,则可以使用相对路径,而不必提供存储库根目录的路径,例如:“git show HEAD:./subdir/main.c > foo”。这适用于最新版本的 git(在 CentOS 7 上的 git 2.8.3 中测试) (2认同)

Jim*_*ker 247

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

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Run Code Online (Sandbox Code Playgroud)

需要注意的是HEAD@{2013-02-25}指在这个仓库"里HEAD是在2013年2月25日"(使用了引用日志),而不是"2013年2月25日之前的最后一次提交这个分支的历史".

  • 这种语法使用reflog的事实很重要,应该强烈强调,因为**reflog不包含所有提交**.请参见http://blog.endpoint.com/2014/05/git-checkout-at-specific-date.html (6认同)
  • 真棒.节省我的时间,而不是去github并查看提交. (4认同)
  • 如果你在一个分支上,这个命令对`master`而不是`HEAD @ {2013-02-25}`很有用 (4认同)

小智 110

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

  1. 启动gitk:

    gitk /path/to/file
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选择屏幕顶部的修订版本,例如按说明或日期.默认情况下,屏幕的下半部分显示该修订的差异(对应于"补丁"单选按钮).

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

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

  • 这也适用于[tig](http://blogs.atlassian.com/2013/05/git-tig/),这是一个curses git repo viewer. (7认同)

Adr*_* Be 80

您还可以使用该命令指定commit hash(通常也称为commit ID).git 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和path/to/file步骤1 的步骤运行命令.

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

  • 如果您不知道文件路径,请使用“git show &lt;SHA1&gt; --name-only”来获取它。 (2认同)
  • `.`对我来说是必要的; 谢谢. (2认同)

Ija*_*een 40

除了Jim Hunziker的回答,

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

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)


san*_*bor 17

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

  • 您还可以运行`git log -p -- filename.txt` 将历史限制在所需的文件中。 (6认同)
  • 看起来`git log -pm`也会显示合并提交. (3认同)

sac*_*_ur 14

要快速查看与旧版本文件的区别,请执行以下操作:

git show -1 filename.txt >与文件的最新版本进行比较

git show -2 filename.txt >与第二个修订版进行比较

git show -3 fielname.txt >与最新的第三修订版进行比较

  • 这些命令为我显示了与当前版本的差异,但没有显示整个文件。 (17认同)
  • 值得注意的是,这个答案与问题“**如何在最近提交中显示给定文件的差异?**”匹配,而不是“**如何使用 Git 查看文件的旧版本?**”原来的问题问。 (3认同)

And*_*rew 7

方式1:(我更喜欢这种方式,无法丢失未提交的数据)

  1. 使用以下命令查找提交 ID: git reflog

  2. 列出提交中的文件 git diff-tree --no-commit-id --name-only -r <commitHash>

    例子:

    git diff-tree --no-commit-id --name-only -r d2f9ba4
    d2f9ba4 是步骤 1 中的提交 ID。

  3. 使用以下命令打开所需文件:

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

    例子:

    git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
    Src/... 是步骤 2 中的文件路径。


方式2:(能够丢失未提交的数据)

  1. 使用以下命令查找提交 ID: git reflog

  2. 对此提交进行硬重置: git reset --hard %commit ID%

    例子:

    git reset --hard c14809fa

  3. 进行必要的更改并在所需的分支中进行新的提交