git diff与交错线

时间:2014-03-02 22:26:40

标签: git diff git-diff

我想要一个带有交错线的差异,即“帅哥”不超过一行。

例如,而不是

-t1 = "Christmas 2013"
-t2 = "Easter 2013"
-t3 = "Thanksgiving 2013"
+t1 = "Christmas 2014"
+t2 = "Easter 2014"
+t3 = "Thanksgiving 2014"

我想要这个:

-t1 = "Christmas 2013"
+t1 = "Christmas 2014"
-t2 = "Easter 2013"
+t2 = "Easter 2014"
-t3 = "Thanksgiving 2013"
+t3 = "Thanksgiving 2014"

到目前为止我已经

git diff -U0 --ignore-space-at-eol before after holidays.ini

我尝试设置--break-rewrites=0%/0%--break-rewrites=100%/0%等等,但它没有改变任何内容(我甚至不知道它是否与我的问题相关)。

3 个答案:

答案 0 :(得分:0)

没有内置的差异算法会以这种方式运行。

我很好奇你想看到的是,例如,改变是添加一行并替换另外两行,以便(抓住你的例子)你会有这样的东西:

-t1 = "Christmas 2013"
+t1 = "Christmas 2014"
+t2 = "Easter 2014"
-t3 = "Thanksgiving 2013"
+t3 = "Thanksgiving 2014"

在这里,对于t2,没有什么可以删除。

无论如何,我相信你最好的选择是对git diff -U0的输出进行后期处理。

如果您使用的是Unix-ish系统,您还可以使用原始的非统一差异,例如:

$ diff --git a/like_min.py b/like_min.py
index 05b9a4d..1c90084 100644
--- a/like_min.py
+++ b/like_min.py
@@ -1 +1 @@
-def like_min(iterable, key=None):
+def like_min(iterable, key=None): # comment
@@ -9 +9 @@ def like_min(iterable, key=None):
-    for candidate in it:
+    for candidate in it: # another comment
$ git show HEAD:like_min.py | diff - like_min.py
1c1
< def like_min(iterable, key=None):
---
> def like_min(iterable, key=None): # comment
9c9
<     for candidate in it:
---
>     for candidate in it: # another comment

可能更容易进行后期处理(取决于许多细节)。特别是每个更改都以行号和字母代码(a dd,c hange,d elete)开头,因此无需确定某些内容是纯添加还是pure-delete,vs你想要分成一行一行的变化。如果 new 行数不匹配,您仍可能需要将“更改”变为“更改后加上或删除”:

$ git show HEAD:like_min.py | diff - like_min.py
1c1,2
< def like_min(iterable, key=None):
---
> def like_min(iterable, key=None): # comment
> def like_min(iterable, key=None): # comment
9c10
<     for candidate in it:
---
>     for candidate in it: # another comment

此外,“旧差异”可能有不同的(而非理想的)白色空间忽略选项。


摆弄--break-rewrites与你想要的正交:它只是改变git认为文件为“完全重写”的点,因此将更改显示为“删除整个以前的文件内容,插入全部 - 新内容“。

默认断点是,根据文档-B50%/60%,它指定不超过60%的文件可以“重写”,或者相当于“至少40%的文件仍然匹配” 。您可能希望减少此值,但可能不希望增加它。 (顺便说一下,我似乎无法将其设置为0%;将其设置为1%会使大多数更改成为完全重写,但是更改(例如更改文件的一行)的小更改仍会显示为较小的更改而非这可能是因为相似性指数并非纯粹基于一次一行的变化,而是包括内线匹配。)

(第一个数字 - -B50%/60%中的50% - 是用于重命名检测的相似性索引值,假设启用了重命名检测。将这两个数字视为“相似性和相异性指数”值:相似性index是“文件1到文件2的距离”,不熟悉只是100%减去相似度。)

答案 1 :(得分:0)

如果差异不需要是文本的,您可以使用KDiff3

KDiff3 screenshot

这将比单行提供更大的粒度。

答案 2 :(得分:0)

我很高兴我不是唯一想要这样做的人。

以下通过paste在相邻行上显示了旧的和新的,并使用uniq作为世界上最差的差异:

git show HEAD:./holidays.ini | paste -d '\n' - holidays.ini | uniq -u

"Christmas 2013"
"Christmas 2014"
"Easter 2013"
"Easter 2014"
"Thanksgiving 2013"
"Thanksgiving 2014"