问题描述
在执行 git diff
时,有时我想使用不同的 diff 工具(例如,cmp
或我自己的 bin 目录中的自制 word-diff 程序)。
许多类似 diff 的程序都有一个选项
-D <diffprog>
告诉他们改用其他 diff 或类似 diff 的程序。
我知道 git-difftool 和 this question,但这并不是我想要的。我宁愿不必提前配置某些东西,我今天要使用的非标准命令可能不是我明天要使用的非标准命令。理想情况下,我希望能够一次性从命令行执行此操作。
(是否可以将 difftool 配置为能够使用多个不在官方列表中的非标准工具?)
如果让 git diff
使用我选择的差异工具太麻烦,我也可以使用类似
git cat file | mydiff - file
我知道没有像“git cat”这样的命令。但这里的想法是手动比较文件的 repo 版本与本地版本,给定一个 git 命令来简单地发出文件的 repo(或在其他情况下,索引)版本。有没有这样的命令?
最后,如果没有我问的假设的 git diff -D diffprog
选项,并且没有我假设的“git cat”命令之类的东西,那么我希望他们有错吗?
解决方法
我想你可能正在寻找类似的东西
git show somecommit:path/to/file | mydiff - path/to/file
或
mydiff <(git show somecommit:path/to/file) \
<(git show someothercommit:path/to/file)
但是有一点手册页阅读说 difftool 确实接受路径限制器,并且还有 -x
选项,所以我看不出有任何问题。对于您评论中的情况,我会使用
git difftool -yx mydiff @ -- file
,
git
中用于在外部查看器中打开差异的集成方式是 git difftool
。
就 cli 选项而言,git difftool
采用与 git diff
相同的参数,并在外部查看器中打开生成的差异。
一个额外有用的选项是 -d | --dir-diff
,它将在一个临时目录中创建您的 repo 的两个结帐,并以“目录比较模式”打开外部查看器:
git difftool -d <something> <something else>
就外部工具的选择而言:
- 您可以配置默认的差异工具:
git config diff.tool kdiff3
- 您可以使用
-t | --tool
选择您想要的任何工具:
git difftool -t meld <something> <something else>
- 您还可以通过在 git 配置中创建
difftool.<tool>.cmd
条目来定义自定义命令
引用 -t|--tool
部分的文档:
您可以通过设置配置变量 difftool.<tool>.path
来明确提供工具的完整路径。例如,您可以通过设置 difftool.kdiff3.path
来配置 kdiff3 的绝对路径。否则,git difftool 假定该工具在 PATH
中可用。
可以自定义 git difftool,而不是运行已知的差异工具之一,以通过在配置变量 difftool.<tool>.cmd
中指定要调用的命令行来运行替代程序。
当使用此工具调用 git difftool 时(通过 -t
或 --tool
选项或 diff.tool
配置变量),将使用以下可用变量调用配置的命令行: $LOCAL
设置为包含 diff 前映像内容的临时文件的名称,$REMOTE
设置为包含 diff 后映像内容的临时文件的名称。 $MERGED
是要比较的文件的名称。 $BASE
是为了与自定义合并工具命令兼容而提供的,其值与 $MERGED
相同。
除了 jthill's answer 中提到的原始 git show
或 git cat-file -p
技巧外,您还可以使用 LeGEC's answer 中所述的 git difftool
。为避免配置出错或需要特殊的一次性配置文件,请考虑在前端 -c
命令中添加 git
选项:
git -c diff.tool=whatever ...
这种模式一般适用:如果你想假装配置文件加起来有一些特定的 x
设置为 y
,git config -c x=y
可以解决问题。多个 -c
选项聚集在一起并按配置使用。
(我相信这会添加到配置中并依赖于“最后的配置覆盖早期的配置”的东西,因此对于像 remote.remote.fetch
这样的多值设置,如果您需要避免选择用户配置,您目前必须使用修改 $HOME
之类的技巧,这有...缺点。即将发布的 Git 版本提供了跳过系统和用户配置的方法,用于特殊目的,包括 Git 自己的自测。)>