Для чего нужен git diff --patience? - PullRequest
205 голосов
/ 28 октября 2010

Чем алгоритм терпения отличается от алгоритма git diff по умолчанию и когда я хотел бы его использовать?

Ответы [ 3 ]

172 голосов
/ 28 октября 2010

Вы можете прочитать сообщение Брэма Коэна , автора алгоритма разности терпения, но я нашел это сообщение в блоге , которое очень хорошо суммирует алгоритм разности терпения:

Patience Diff вместо этого сосредотачивает свою энергию на низкочастотных линиях с высоким содержанием, которые служат маркерами или сигнатурами важного содержимого в тексте. Это по-прежнему основанный на LCS diff, но с важным отличием, поскольку он учитывает только самую длинную общую подпоследовательность строк сигнатуры:

Найдите все строки, которые встречаются ровно по одному разу с обеих сторон, затем выполните самую длинную общую подпоследовательность на этих линиях, сопоставляя их.

Когда вы должны использовать diff терпения? По словам Брэма, разница в терпении хороша для этой ситуации:

Действительно плохие случаи, когда две версии разошлись значительно, и разработчик не заботится о сохранении размеров патчей под контролем. При таких обстоятельствах алгоритм сравнения может иногда стать «смещенным» в том смысле, что он соответствует длинным участкам фигурных скобок вместе, но это приводит к корреляции фигурных скобок функций в одна версия с фигурными скобками следующей более поздней функции в другая версия. Эта ситуация очень уродлива , и может привести к непригодный файл конфликта в ситуации, когда вам нужны такие вещи представлены согласованно наиболее.

49 голосов
/ 29 декабря 2011

Вы также можете использовать его для слияний (здесь очень хорошо работало для некоторых конфликтов XML):

32 голосов
/ 11 апреля 2016

Алгоритм определения терпения - это более медленный алгоритм сравнения, который в некоторых случаях показывает лучшие результаты.

Предположим, у вас есть следующий файл, зарегистрированный в git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Теперь мы изменим порядок разделов и добавим новую строку:

.bar {
    margin: 0;
}

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

Алгоритм сравнения по умолчанию утверждает, что заголовки разделов изменились:

$ 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 дополнительно изучает эвристику .

Обратите внимание, что у алгоритма * терпения есть некоторые известные патологические случаи .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...