git diff 在完整回购和单个文件上使用时产生不同的结果

git diff produces different results when used on full repo vs a single file

我们尝试创建一个补丁文件,其中包含两个 moodle 版本之间的变化。

这就是我们所做的

$ git clone https://github.com/moodle/moodle.git
$ cd moodle
$ git diff  v3.8.1...v3.11.0 > /tmp/upgrade3_8_1__3_11_0.patch

但是当我们验证这个文件时,补丁看起来很奇怪:

$ grep " a/version.php" /tmp/upgrade3_8_1__3_11_0.patch -A 13
diff --git a/version.php b/version.php
index 6806d4e84d7..9c4d48bbb41 100644
--- a/version.php
+++ b/version.php
@@ -29,9 +29,9 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2019111800.00;              // 20191118      = branching date YYYYMMDD - do not modify!
+$version  = 2021051700.00;              // 20210517      = branching date YYYYMMDD - do not modify!
                                     //         RR    = release increments - 00 in DEV branches.
                                     //           .XX = incremental changes.
-$release  = '3.8 (Build: 20191118)'; // Human-friendly version name
-$branch   = '38';                       // This version's branch.
+$release  = '3.11 (Build: 20210517)';// Human-friendly version name
+$branch   = '311';                      // This version's branch.

问题:

应该是

-$release  = '3.8.1 ...

而不是

-$release  = '3.8 ...

如果我们只在 version.php 上执行命令,它会产生预期的结果:

$ git diff v3.8.1..v3.11.0 version.php
diff --git a/version.php b/version.php
index 93c45b4ab93..9c4d48bbb41 100644
--- a/version.php
+++ b/version.php
@@ -29,9 +29,9 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2019111801.00;              // 20191118      = branching date YYYYMMDD - do not modify!
+$version  = 2021051700.00;              // 20210517      = branching date YYYYMMDD - do not modify!
                                     //         RR    = release increments - 00 in DEV branches.
                                     //           .XX = incremental changes.
-$release  = '3.8.1 (Build: 20200113)'; // Human-friendly version name
-$branch   = '38';                       // This version's branch.
+$release  = '3.11 (Build: 20210517)';// Human-friendly version name
+$branch   = '311';                      // This version's branch.
 $maturity = MATURITY_STABLE;             // This version's maturity level.

怎么可能?

我们如何创建正确的补丁程序?

Sidenode:我们甚至有一个 - 无法重现的案例 - git diff v3.8.1..v3.11.0 version.php 也显示了错误的结果。输出不应该是确定性的吗?是否依赖于当前分支?

$ git --version
git version 2.25.1

这是之前配置的:

git config diff.renameLimit 999999

您使用的是 3 个点 ...,这与使用 .. 不同。这 2 个修订版的共同祖先可能是 3.8,这就是为什么您会看到这样的修订集。

并且,在比较文件时,您使用的是 ..。尝试 ...,你会得到相同的 "unexpected" 结果。