Git 中是否有命令可以查看(转储到标准输出,或转储到$PAGER
或$EDITOR
)特定文件的特定版本?
10 回答
您可以使用git show
来自存储库根目录的路径(./
或../
用于相对路径):
$ git show REVISION:path/to/file
替换REVISION
为您的实际修订版(可以是 Git 提交 SHA、标签名称、分支名称、相对提交名称或任何其他在 Git 中识别提交的方式)
例如,要查看<repository-root>/src/main.c
4 次提交前的文件版本,请使用:
$ git show HEAD~4:src/main.c
即使在相对于当前目录的路径中,Windows 版 Git 也需要正斜杠。有关更多信息,请查看git-show
.
如果提交发生在过去 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
如果你喜欢 GUI,你可以使用 gitk:
开始 gitk:
gitk /path/to/file
在屏幕顶部选择修订,例如通过描述或日期。默认情况下,屏幕的下半部分显示该版本的差异,(对应于“补丁”单选按钮)。
要查看所选修订的文件:
- 单击“树”单选按钮。这将显示该版本的文件树的根。
- 深入到您的文件。
您还可以使用命令commit hash
指定一个(通常也称为commit ID
)。git show
简而言之
git show <commitHash>:/path/to/file
一步步
- 显示给定文件的所有更改的日志
git log /path/to/file
- 在显示的更改列表中,它显示了
commit hash
诸如commit 06c98...
(06c98... 是提交哈希) - 复制
commit hash
git show <commitHash>:/path/to/file
使用commit hash
步骤 3 的和步骤 1 的运行命令path/to/file
。
注意:./
在指定相对路径时添加似乎很重要,即git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
.
除了Jim Hunziker的回答,
您可以将修订版中的文件导出为,
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
希望这可以帮助 :)
要快速查看与文件旧版本的差异:
git show -1 filename.txt
> 与文件的最新版本进行比较
git show -2 filename.txt
> 与第二次修订比较
git show -3 fielname.txt
> 与最后第三次修订进行比较
git log -p
不仅会显示提交日志,还会显示每个提交的差异(合并提交除外)。然后您可以按/
,输入文件名并按enter
。按n
或p
转到下一个/上一个事件。这样,您不仅会看到文件中的更改,还会看到提交信息。
方式1:(我更喜欢这种方式,不会丢失未提交的数据)
使用以下命令查找提交 ID:
git reflog
列出提交的文件
git diff-tree --no-commit-id --name-only -r <commitHash>
例子:
git diff-tree --no-commit-id --name-only -r d2f9ba4
d2f9ba4
是步骤 1 中的提交 ID。使用以下命令打开所需文件:
git show <commitHash>:/path/to/file
例子:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
Src/...
是步骤 2 中的文件路径。
方式2:(能够丢失未提交的数据)
使用以下命令查找提交 ID:
git reflog
对此提交进行硬重置:
git reset --hard %commit ID%
例子:
git reset --hard c14809fa
进行必要的更改并对所需的分支进行新的提交
您可以使用这样的脚本将文件的所有版本转储到单独的文件中:
例如
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
在此处获取脚本作为另一个类似问题的答案
从给定版本中获取多个文件的助手
当试图解决合并冲突时,这个助手非常有用:
#!/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)
用法:
git-show-save other-branch file1.c path/to/file2.cpp
结果:以下包含文件的替代版本:
file1.old.c
path/to/file2.old.cpp
这样,您可以保留文件扩展名,这样您的编辑就不会抱怨,并且可以轻松找到新文件旁边的旧文件。