簡體   English   中英

什么是`git diff --patience`?

[英]What is `git diff --patience` for?

耐心算法與默認的git diff算法有何不同,我何時想使用它?

你可以閱讀耐心差異算法的作者Bram Cohen的帖子 ,但我發現這篇博文很好地總結了耐心差異算法:

相反,Patience Diff將其能量集中在低頻高內容線上,這些線用作文本中重要內容的標記或簽名。 它仍然是基於LCS的差異,但有一個重要區別,因為它只考慮簽名行的最長公共子序列:

查找兩側恰好出現一次的所有行,然后在這些行上執行最長的公共子序列,將它們匹配起來。

你應該什么時候使用耐心差異? 根據Bram的說法,耐心差異對這種情況有好處:

真正糟糕的情況是兩個版本發生了巨大分歧並且開發人員不小心控制補丁大小。 在這種情況下,diff算法有時可能會變得“錯位”,因為它將大括號的大部分匹配在一起,但它最終將一個版本中函數的大括號與另一個版本中下一個函數的大括號相關聯。 這種情況非常難看 ,並且在您需要最大限度地呈現這些內容的情況下,可能會導致完全無法使用的沖突文件。

您也可以將它用於合並(在這里非常適用於某些XML沖突):

git merge --strategy-option=patience ...

耐心差異算法是一種較慢的差異算法,在某些情況下會顯示更好的結果。

假設您已將以下文件簽入git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

現在我們重新排序這些部分並添加一個新行:

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}

默認的diff算法聲稱章節標題已更改:

$ git diff --diff-algorithm=myers   
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
     margin: 0;
 }

-.bar {
+.foo1 {
     margin: 0;
+    color: green;
 }

而耐心差異顯示的結果可以說更直觀:

$ git diff --diff-algorithm=patience
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
-    margin: 0;
-}
-
 .bar {
     margin: 0;
 }
+
+.foo1 {
+    margin: 0;
+    color: green;
+}

這里有一個很好的討論主觀差異質量git 2.11正在進一步探索差異啟發式

請注意, 耐心差異算法仍然存在一些已知的病理情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM