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

时间:2019-01-03 12:45:37

标签: git 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+}

但是,在自定义单词diff regex以忽略空格差异的情况下,例如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行不同,这些行并不完全相同。

但是根据单词diff-regex,有git选项可以不显示未更改的行吗?

2 个答案:

答案 0 :(得分:1)

没有这样的选择,但是应该有。如您所料,Git实际上是逐行进行比较,然后在结果上叠加了逐字编辑指令。当单词定义导致“不变”时,您将得到所看到的。

(或者,单词差异可以将单词用作馈入内部差异引擎的实际符号。但这会导致输入更大,而Myers算法为O(ND),因此,随着N和D都增加,这将用更多的时间。)

答案 1 :(得分:0)

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

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

输出:

Line [-7-]{+6+}

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