1749

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

4

10 回答 10

1991

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

$ git show REVISION:path/to/file

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

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

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

即使在相对于当前目录的路径中,Windows 版 Git 也需要正斜杠。有关更多信息,请查看git-show.

于 2008-12-03T19:46:52.793 回答
287

如果提交发生在过去 90 天内,则按日期执行此操作如下所示:

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

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

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

git show $(git rev-list -1 --before="2013-02-26" HEAD):./fileInCurrentDirectory.txt
于 2013-03-07T17:05:24.470 回答
127

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

  1. 开始 gitk:

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

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

    • 单击“树”单选按钮。这将显示该版本的文件树的根。
    • 深入到您的文件。
于 2012-12-19T18:21:57.967 回答
103

您还可以使用命令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 的和步骤 1 的运行命令path/to/file

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

于 2016-11-03T11:21:50.763 回答
50

除了Jim Hunziker的回答,

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

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

希望这可以帮助 :)

于 2014-04-30T05:07:42.637 回答
42

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

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

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

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

于 2018-12-13T06:05:00.390 回答
30

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

于 2016-05-06T20:02:07.693 回答
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. 进行必要的更改并对所需的分支进行新的提交

于 2020-01-26T00:16:47.517 回答
3

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

例如

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

在此处获取脚本作为另一个类似问题的答案

于 2017-10-30T17:01:27.827 回答
1

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

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

#!/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 上游.

用法:

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

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

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

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

于 2018-12-07T10:54:05.813 回答