使用 git word-diff 时隐藏未更改的行

Hide unchanged lines when using git word-diff

我有两个文件,old.txt:

Line 1
Line 2
Line 3
Line4
Line5
Line 7
Line 7
Line 8

new.txt

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8

如果我 运行 git diff --no-index --word-diff-regex=. old.txt new.txt 那么它表明唯一的变化是第 4 行和第 5 行的空白修复以及第 6 行的错误数字修复:

diff --git a/old.txt b/new.txt
index be8495f..a982fdc 100644
--- a/old.txt
+++ b/new.txt
@@ -1,8 +1,8 @@
Line 1
Line 2
Line 3
Line{+ +}4
Line{+ +}5
Line [-7-]{+6+}
Line 7
Line 8

不幸的是,它也显示了未更改的行(1 到 3、7 和 8),但这可以通过删除带有 --unified=0 的上下文行来解决,例如git diff --no-index --unified=0 --word-diff-regex=. old.txt new.txt:

diff --git a/old.txt b/new.txt
index be8495f..a982fdc 100644
--- a/old.txt
+++ b/new.txt
@@ -4,3 +4,3 @@ Line 3
Line{+ +}4
Line{+ +}5
Line [-7-]{+6+}

但是,在自定义 word-diff 正则表达式以忽略空格差异的情况下,例如git diff --no-index --unified=0 --word-diff-regex="[^[:space:]]" old.txt new.txt,显示:

diff --git a/old.txt b/new.txt
index be8495f..a982fdc 100644
--- a/old.txt
+++ b/new.txt
@@ -4,3 +4,3 @@ Line 3
Line 4
Line 5
Line [-7-]{+6+}

请注意,第 4 行和第 5 行现在没有任何变化,但仍出现在输出中。这可能是因为与第 1 行到第 3 行不同,这些行并不完全相同。

然而,根据 word-diff-regex,是否有 git 选项不显示未更改的行?

没有这样的选项,但可能应该有。正如您猜测的那样,Git 实际上是逐行比较,然后在结果上叠加逐字编辑指令。当单词定义结果为 "no change" 时,您将得到所见即所得。

(或者,word-diff 可以使用单词作为输入到内部 diff 引擎的实际符号。但这会导致更大的输入,而 Myers 算法是 O(ND),因此随着 N 和 D 的增加,这会花费更多时间。)

最后,我使用 grep 仅通过使用表达式 grep -E "\{\+|\[-" 查找 {+[- 来显示有变化的行,例如

git diff --no-index --unified=0 --word-diff-regex="[^[:space:]]" old.txt new.txt | grep -E "\{\+|\[-"

输出:

Line [-7-]{+6+}

这不会给出有效的补丁文件作为输出,但它对我来说效果很好,因此我可以直观地比较一些大文件之间的变化。