在Git中,有多种方法可以从任何特定的提交中提取任何特定的文件。
最简单、最直接的方法是使用git checkout
,但git checkout
将其结果写入索引和/或工作树。由于您现有的、已修改但尚未提交的文件已经在工作树中,正如Roland Smith在回答中指出的那样,您需要将该文件保存到其他位置,然后再将其覆盖到工作树中。
不过,有一种非常简单的方法可以在不使用git checkout
的情况下从提交中提取或查看任何文件,包括二进制文件。只需使用git show
来命名提交和路径,如果需要的话,可以使用shell重定向使结果输出转到某个任意路径:
git show HEAD:textures/concrete01.tex > /tmp/original
例如。然后,您可以使用任何可用的工具来比较两者。请注意,HEAD
一如既往地命名当前提交。如果您希望获得在提交badf00d
中或在分支zorg
顶端的提交中找到的版本,可以分别使用git show badf00d:textures/concrete01.tex
或git show zorg:textures/concrete01.tex
。
有一个警告不适用于您的特定情况:以这种方式使用git show
会跳过git checkout
将基于文件的.gitattributes
条目应用的任何过滤(污迹过滤器和行尾转换)。假设文件是二进制的,那么几乎可以肯定的是,您既没有也不想要任何这样的过滤。如果没有过滤器,跳过它——即获得未经修改的原始文件内容——显然与不跳过它具有相同的效果,后者也获得未经更改的原始文件属性。
(除了git show
技术之外,您还可以使用临时工作树,例如git cat-file -p
来提取任意文件。但git show
是供人类使用的命令,而不是自动脚本。)
将修改后的textures/concrete01.tex
复制到回购中的某个位置。然后git checkout textures/concrete01.tex
得到未修改的版本。
现在,您可以将两者加载到查看器中并进行比较。
如果要保留更改,请将修改后的纹理复制回repo并提交。
如果你经常有这些差异,你可以设置一个自定义的差异过滤器,如下所述。
有一种为二进制文件生成diff的机制。diff
属性。您可以在.gitattributes
中放入以下内容:
*.tex binary
*.tex diff=texture
然后在.gitconfig
中,您可以定义一个过滤器。
[diff "texture"]
command = texture_differ
texture_differ
程序将使用七个参数调用,包括旧文件和新文件。参见git手册中的GIT_EXTERNAL_DIFF
。
它应该输出文件之间的文本差异。但我想也可以在查看器中并排显示这两个文件。