如何使用Git查看文件的旧版本?

Git中是否有一个命令可以查看(无论是转储到标准输出,还是在$PAGER$EDITOR中)特定文件的特定版本?

581796 次浏览

您可以使用git show和来自存储库根目录的路径(./../用于相对路径):

$ git show REVISION:path/to/file

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

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

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

Git for Windows即使在相对于当前目录的路径中也需要正斜杠。有关更多信息,请查看#0的手册页。

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

  1. 开始gitk:

    gitk /path/to/file
  2. Choose the revision in the top part of the screen, e.g. by description or date. By default, the lower part of the screen shows the diff for that revision, (corresponding to the "patch" radio button).

  3. To see the file for the selected revision:

    • Click on the "tree" radio button. This will show the root of the file tree at that revision.
    • Drill down to your file.

按日期执行此操作看起来像这样如果提交发生在过去90天内

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

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

这很重要!这意味着,默认情况下,此方法仅适用于过去90天内的历史记录。否则,你需要这样做:

git show $(git rev-list -1 --before="2013-02-26" HEAD):./fileInCurrentDirectory.txt

除了Jim Hunziker的答案,

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

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

希望有帮助:)

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

您还可以使用#2命令指定commit hash(通常也称为commit ID)。


简而言之

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


一步一步

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

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

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

e. g.

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

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

从给定版本中获取多个文件的助手

当尝试解决合并冲突时,这个助手非常有用:

#!/usr/bin/env python3
import argparseimport osimport 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' + extwith open(new_path, 'w') as f:subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

github上游

用法:

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

结果:以下包含文件的替代版本:

file1.old.cpath/to/file2.old.cpp

这样,您可以保留文件扩展名,这样您的编辑器就不会抱怨,并且可以轻松地在新文件旁边找到旧文件。

要快速查看文件与旧版本的差异:

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

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

git show -3 fielname.txt>与上一次第三次修订进行比较

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