Skip to content

git-range-diff

比较两个提交范围(例如一个分支的两个版本)。

概要

bash
git range-diff [--color=[<when>]] [--no-color] [<diff-options>]
	[--no-dual-color] [--creation-factor=<factor>]
	[--left-only | --right-only] [--diff-merges=<format>]
	[--remerge-diff]
	( <range1> <range2> | <rev1>...<rev2> | <base> <rev1> <rev2> )
	[[--] <path>...]

描述

此命令显示两个版本的补丁系列之间的差异,或者更一般地说,显示两个提交范围之间的差异(忽略合并提交)。

在存在 <path> 参数的情况下,这些提交范围会相应地受到限制。

为此,它首先从两个提交范围中找到相互对应的提交对。当两个提交之间的差异(即作者信息、提交消息和提交差异)相对于补丁的大小来说合理地小时,这两个提交被认为是对应的。有关详细信息,请参阅下面的"算法"。

最后,匹配的提交列表按照第二个提交范围的顺序显示,未匹配的提交在其所有祖先显示后立即插入。

有三种方式指定提交范围:

  • <range1> <range2>:任一提交范围可以采用 <base>..<rev><rev>^!<rev>^-<n> 的形式。有关更多详细信息,请参阅 gitrevisions(7) 中的"指定范围"。
  • <rev1>...<rev2>:这等同于 <rev2>..<rev1> <rev1>..<rev2>
  • <base> <rev1> <rev2>:这等同于 <base>..<rev1> <base>..<rev2>

选项

  • --no-dual-color:当提交差异不同时,git range-diff 会重新创建原始差异的颜色,并添加带有红色/绿色背景的外部 -/+ 差异标记,以便更容易查看。此外,仅在第一个提交范围中存在的提交差异行会以"暗淡"方式显示,仅在第二个提交范围中存在的提交差异行会以粗体显示。这被称为"双色模式"。使用 --no-dual-color 可恢复为根据外部差异标记为所有行着色。
  • --creation-factor=<percent>:将创建/删除成本修正因子设置为 <percent>。默认值为 60。如果 git range-diff 错误地将大型更改视为完全重写(删除一个提交并添加另一个提交),请尝试使用更大的值;反之则使用更小的值。
  • --left-only:抑制第一个指定范围(或使用 <rev1>...<rev2> 形式时的"左范围")中缺失的提交。
  • --right-only:抑制第二个指定范围(或使用 <rev1>...<rev2> 形式时的"右范围")中缺失的提交。
  • --diff-merges=<format>:不忽略合并提交,而是使用 git-log(1) 的相应 --diff-merges=<format> 选项为其生成差异,并将其包含在比较中。注意:在常见情况下,remerge 模式将是最自然使用的模式,因为它只显示 Git 合并机制所产生的内容之上的差异。换句话说,如果合并提交是非冲突 git merge 的结果,remerge 模式将以空差异表示它。
  • --remerge-diff:便捷选项,等同于 --diff-merges=remerge
  • --notes[=<ref>]:此标志传递给生成补丁的 git log 程序(参见 git-log(1))。
  • --no-notes:不传递笔记标志。
  • <range1> <range2>:比较由两个范围指定的提交,其中 <range1> 被视为 <range2> 的较旧版本。
  • <rev1>...<rev2>:等同于传递 <rev2>..<rev1><rev1>..<rev2>
  • <base> <rev1> <rev2>:等同于传递 <base>..<rev1><base>..<rev2>。注意 <base> 不需要是分支的精确分支点。

git range-diff 也接受常规的 diff 选项(参见 git-diff(1)),最值得注意的是 --color[=<when>]--no-color 选项。这些选项在生成"补丁之间的差异"时使用,即比较对应的旧/新提交的作者、提交消息和差异。

输出稳定性

range-diff 命令的输出可能会发生变化。它旨在成为人类可读的 porcelain 输出,而不是可以在 Git 版本之间用于获得文本稳定 range-diff 的东西。同样也没有 git-apply(1)range-diff 等效项,输出不打算被机器读取。

在传递 diff 选项时尤其如此。目前,像 --stat 这样的选项可能会产生在 range-diff 上下文中相当无用的输出。range-diff 的未来版本可能会学会以特定于 range-diff 的方式解释此类选项。

配置

此命令使用 diff.color.*pager.range-diff 设置(后者默认开启)。参见 git-config(1)

示例

当变基需要解决合并冲突时,使用以下命令直接比较变基引入的更改:

bash
$ git range-diff @{u} @{1} @

git range-diff 的典型输出如下所示:

-:  ------- > 1:  0ddba11 Prepare for the inevitable!
1:  c0debee = 2:  cab005e Add a helpful message at the start
2:  f00dbal ! 3:  decafe1 Describe a bug
    @@ -1,3 +1,3 @@
     Author: A U Thor <author@example.com>

    -TODO: Describe a bug
    +Describe a bug
    @@ -324,5 +324,6 @@
      This is expected.

    -+What is unexpected is that it will also crash.
    ++Unexpectedly, it also crashes. This is a bug, and the jury is
    ++still out there how to fix it best. See ticket #314 for details.

      Contact
3:  bedead < -:  ------- TO-UNDO

在此示例中,有 3 个旧提交和 3 个新提交,开发人员删除了第 3 个,在前两个之前添加了一个新的,并修改了第 2 个提交的提交消息及其差异。

当输出到终端时,默认会进行颜色编码,就像常规 git diff 的输出一样。此外,第一行(添加提交)是绿色的,最后一行(删除提交)是红色的,第二行(完美匹配)是黄色的,就像 git show 输出的提交头一样,第三行将旧提交着色为红色,新提交着色为绿色。

算法

基本思想是:我们在两个提交范围中的提交之间生成一个成本矩阵,然后求解最小成本分配。

成本矩阵的填充方式如下:对于每对提交,生成两个差异,然后生成"差异的差异"(带 3 个上下文行),然后使用该差异中的行数作为成本。

为了避免误报(例如,当一个补丁被删除,并且在同一补丁系列的两次迭代之间添加了一个不相关的补丁时),成本矩阵通过为批量删除/添加添加固定成本条目来扩展。

另请参阅

git-log(1)

Git

git 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布