Для чего нужен git diff --patience?

219

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

Гейб Моутарт
источник
1
Возможно, он соответствует перемещенному коду и измененным строкам, которые могут быть намного медленнее
codymanix
Я извлек отдельный скрипт для Patience Diff из Bazaar, вы можете найти его в другой ветке SO .
TryPyPy
38
Дополнительный вопрос. Когда я не должен использовать diff терпения?
балки
4
Существует также --histogramпараметр, который «... расширяет алгоритм терпения для« поддержки общих элементов с низкой частотой
Robert

Ответы:

183

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

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

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

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

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

Марк Рушаков
источник
3
По моему опыту с XML на данный момент, он дает такие же «плохие» результаты, как и обычный diff.
stivlo
5
Мне повезло больше с разницей в терпении с XML; конечно, различие, на которое я смотрю в настоящее время, имеет точно проблему смещения, описанную с помощью обычного алгоритма различий, но выглядит совершенно великолепно с разницей терпения.
me_and
22
В этом блоге есть отличное объяснение, в том числе анимированный GIF процесса: alfedenzo.livejournal.com/170301.html
Quantum7
3
Я нашел этот блог очень интересным и дает хорошее объяснение с дальнейшими ссылками на детали алгоритмов: fabiensanglard.net/git_code_review/diff.php Надеюсь, он кому-нибудь пригодится
SathOkh
Фробниц / фиб / факт различий
Джордж В. Рейли
52

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

git merge --strategy-option=patience ...
robinst
источник
51
Или черезgit config --global diff.algorithm patience
Тобу
11
Короче будет git merge -X patience.
PythonNut
42

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

Предположим, у вас есть следующий файл, зарегистрированный в 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;
 }

Принимая во внимание, что терпение diff показывает результат, который возможно более интуитивен:

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

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

Уилфред Хьюз
источник