2014-03-02 274 views
6

我想要一個具有交錯行的差異,即「hunk」不超過一行。git diff with interleaved lines

例如,而不是

-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%等,但它沒」不會改變任何東西(我甚至不知道它是否與我的問題有關)。

回答

0

沒有任何內置的差異算法會以這種方式表現。

我很好奇你想看看如果改變是增加一行和替換兩個,所以(抓住你的例子)你會有這樣的事情:

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

這裏,對於t2,沒有什麼可刪除的。

無論如何,我相信你最好的選擇可能是後處理輸出git diff -U0

如果你是一個Unix的十歲上下的系統,你也可以使用原始的,非統一差異,例如:

$ 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),因此不需要確定是純粹添加還是純粹刪除,還是需要分割更改一次一行。您還可能需要開啓一個「變」成「改變,然後添加或 - 刪除」如果行數不匹配:

$ 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擺弄你想要的是正交的:它只是改變了在該混帳認爲文件爲「完全重寫」的地步,從而顯示其更改爲「刪除所有以前的文件內容,插入清一色新內容「。

根據文檔-B50%/60%,默認斷點指定不能超過60%的文件可以被「重寫」,或者等同於「至少40%的文件仍然匹配」。你可能想減少這個,但可能不想增加它。 (順便說一下,我似乎無法將其設置爲0%;將其設置爲1%會使大部分更改變爲完整的重寫,但是很小的更改(例如只更改文件的一行)仍顯示爲小的更改,而不是總文件這可能是因爲相似性指數並非完全基於一次一行的變化,而是還包括行內匹配。)

(第一個數字 - 即-B50%/60%中的50% - 是假定重命名檢測被啓用,用於重命名檢測的相似性索引值。將這兩個數字看作「相似性和相異性指數」的值:相似性指數是「文件1與文件2的接近程度」,不相似度僅爲100%減去相似度。)

0

如果差異不是必需的是文本,你可以使用KDiff3

KDiff3 screenshot

這會給出一個比單行更大的粒度。