git diff 忽略换行

git diff ignore newlines

我正在使用:

git diff --ignore-space-at-eol -b -w --ignore-blank-lines --ignore-cr-at-eol COMMIT1 COMMIT2

区分两个提交删除白色 space 但它仍然显示以下内容,这基本上只是一个换行符更改:

- <div class="model-content" style="border: 2px solid #d5001e;border-radius: 8px;">
- <div class="model-header" style="border-bottom: 1px solid #d5001e;background: #d5001c;">
+ <div class="model-content"
+     style="border: 2px solid #d5001e;border-radius: 8px;">
+     <div class="model-header"
+         style="border-bottom: 1px solid #d5001e;background: #d5001c;">

问题: 如何让git diff忽略这些新行?

不幸的是,Git 的主要差异算法是基于行的。在应用空格修改之前 分割行(好吧,它确实有点混合在一起)。结果是任何时候原来的单行变成两行,反之亦然,git diff 本身总是将此视为更改。1

使用 Git 的 word-diff,您可以以忽略换行符的方式获得算法的输出 post-processed。结果相当古怪,因为如果实际更改影响 no 个单词,您会得到一个 diff hunk header,后跟一个没有显示任何更改的块(!)。不过,这对您的示例没有任何实际帮助。


1从技术上讲,这里发生的事情是 Git 将每个输入行视为单个符号。然后它在 符号 上运行选定的算法,通常是 Myers。由于线条被拆分并成为单独的符号,因此您的特定示例在输入的左侧有一个符号,在右侧变成两个不同的符号,对于两个原始 <div ...> 行中的每一行。

有关此的更多信息,请参阅我的 stalled-out book.

原型中当前第 60–66 页的内容