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

时间:2008-12-03 19:31:48

标签: git

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

10 个答案:

答案 0 :(得分:1517)

您可以使用git show

$ git show REVISION:path/to/file

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

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

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

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

答案 1 :(得分:234)

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

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

请注意,HEAD@{2013-02-25}表示此存储库中的“HEAD位于2013-02-25”(使用the reflog),而不是“历史记录中此分支中2013-02-25之前的最后一次提交” ”

答案 2 :(得分:106)

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

  1. 启动gitk:

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

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

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

答案 3 :(得分:74)

您还可以使用git show command指定commit hash(通常也称为commit ID)。

简而言之

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

一步一步

  1. 使用git log /path/to/file
  2. 显示给定文件的所有更改的日志
  3. 在显示的更改列表中,它显示commit hash,例如commit 06c98...(06c98 ...是提交哈希)
  4. 复制commit hash
  5. 使用步骤3&amp;的git show <commitHash>:/path/to/file运行命令commit hash。第1步的path/to/file
  6. 注意:在指定相对路径时添加./似乎很重要,即git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html

答案 4 :(得分:36)

Jim Hunziker的答案外,

您可以将修订版中的文件导出为

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

希望这会有所帮助:)

答案 5 :(得分:15)

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

答案 6 :(得分:6)

要快速查看与旧版本文件的区别:

  

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

     

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

     

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

答案 7 :(得分:5)

方式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. 进行必要的更改并将新提交提交到所需分支

答案 8 :(得分:3)

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

e.g。

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

获取script here作为另一个类似问题的答案

答案 9 :(得分:0)

帮助程序可以从给定的版本中获取多个文件

当尝试解决合并冲突时,此帮助程序非常有用:

#!/usr/bin/env python3

import argparse
import os
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
    file_relative = os.path.relpath(os.path.abspath(path), toplevel)
    base, ext = os.path.splitext(path)
    new_path = base + '.old' + ext
    with open(new_path, 'w') as f:
        subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

GitHub upstream

用法:

git-show-save other-branch file1.c path/to/file2.cpp

结果:以下内容包含文件的备用版本:

file1.old.c
path/to/file2.old.cpp

通过这种方式,您可以保留文件扩展名,以便您的编辑者不会抱怨,并且可以轻松地在较新的文件旁边找到旧文件。