对于 "git diff" 是否有 -U<infinity> 选项来显示整个文件?

For "git diff" is there a -U<infinity> option to show the whole file?

我需要以编程方式为网络生成全上下文 git 差异 ui。

用于生成全上下文差异的 CLI 包含在以下问题中:

普遍的答案类似于 git diff -U99999

使用具有高得离谱的阈值(例如 999,999)的 -U / --unified 选项,执行 git diff -U999999:

  1. 让我怀疑可能会影响性能
  2. 更糟糕的是,如果我的文件大于 1M 行,这就是正确性问题

是否有 -U 选项来显示整个文件?

坦率地说,最好的选择是使用 git difftool 而不是普通的 git diff。要查看您的 git 版本支持哪些工具,请输入

git difftool --tool-help

我的版本 (2.3.0) 显示以下内容

$ git difftool --tool-help
'git difftool --tool=<tool>' may be set to one of the following:
        araxis
        gvimdiff
        gvimdiff2
        gvimdiff3
        meld
        vimdiff
        vimdiff2
        vimdiff3

The following tools are valid, but not currently available:
        bc
        bc3
        codecompare
        deltawalker
        diffmerge
        diffuse
        ecmerge
        emerge
        kdiff3
        kompare
        opendiff
        p4merge
        tkdiff
        xxdiff

我通常使用meld,但这只是个人喜好。 git difftool 采用与 git diff 相同的参数加上一些有助于此过程的参数(我发现 -y 有助于防止从一个文件移动到下一个文件时出现提示)。

例如,要检查特定提交引入的更改,您可以使用

git difftool -y -t meld 08f0f82^..08f0f82

显然用正确的 SHA-1 替换 08f0f82

我最大的抱怨是它按顺序为每个修改后的文件启动该工具(因此指定 -y 选项)。

如果您只想检查该提交中对特定文件的更改,您只需将文件名添加到命令行即可。

git difftool -y -t meld 08f0f82^..08f0f82 myfile.c

显然,这是供交互使用的 - 不适用于脚本

如果您只是将大数字与 -U 一起使用,您可以选择大数字作为 您的应用程序 无法处理显示这样的点大文件(差异)。

it's a correctness issue if my file is larger than 1M lines

为了解决这个问题,您可以检查多行 @@ ... @@ 行的输出以确定它是否完整——这可以避免您默默地给出错误的数字。