我修改了一个二进制文件。修改后的二进制文件的路径是textures / concrete01.tex。我想打开未修改的版本并直观地比较它们。我在哪里可以找到未修改的文件?
答案 0 :(得分:1)
将修改后的textures/concrete01.tex
复制到您的仓库中。然后git checkout textures/concrete01.tex
获取未修改的版本。
现在您可以将两者加载到查看器中并进行比较。
如果要保留更改,请将修改后的纹理复制回repo并提交。
如果您经常遇到这些差异,可以按照以下说明设置自定义差异滤镜。
有一种为二进制文件生成差异的机制。 diff
属性。您可以将以下内容放在.gitattributes
:
*.tex binary
*.tex diff=texture
然后在.gitconfig
中,您可以定义过滤器。
[diff "texture"]
command = texture_differ
将使用七个参数调用texture_differ
程序,包括旧文件和新文件。请参阅git manual中的GIT_EXTERNAL_DIFF
。
应该输出文件之间的文本差异。但我想也可能是例如在查看器中并排显示两个文件。
答案 1 :(得分:1)
在Git中,有多种方法可以从任何特定的提交中提取任何特定文件。
最简单,最直接的方法是使用git checkout
,但git checkout
将其结果写入索引和/或工作树。由于您现有的,已修改但尚未提交的文件已经在工作树中,因此Roland Smith notes in his answer需要保存该文件。在工作树中覆盖它。
但是,有一种非常简单的方法可以使用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
是要使用的命令由人而不是自动脚本。)