Чем алгоритм терпения отличается от алгоритма по умолчанию git diff
и когда я хочу его использовать?
--histogram
параметр, который «... расширяет алгоритм терпения для« поддержки общих элементов с низкой частотой
Чем алгоритм терпения отличается от алгоритма по умолчанию git diff
и когда я хочу его использовать?
--histogram
параметр, который «... расширяет алгоритм терпения для« поддержки общих элементов с низкой частотой
Ответы:
Вы можете прочитать сообщение от Брэма Коэна , автора алгоритма разности терпения, но я нашел этот пост в блоге, который очень хорошо суммирует алгоритм разности терпения:
Вместо этого Patience Diff сосредотачивает свою энергию на низкочастотных линиях с высоким содержанием, которые служат маркерами или сигнатурами важного содержимого в тексте. Это по-прежнему основанный на LCS diff, но с важным отличием, поскольку он учитывает только самую длинную общую подпоследовательность строк сигнатуры:
Найдите все строки, которые встречаются ровно один раз с обеих сторон, а затем выполните самую длинную общую подпоследовательность для этих линий, сопоставляя их.
Когда вы должны использовать терпение diff? По словам Брэма, разница в терпении хороша для этой ситуации:
Действительно плохие случаи, когда две версии резко разошлись, и разработчик не заботится о том, чтобы держать размеры патчей под контролем. При таких обстоятельствах алгоритм diff может иногда становиться «смещенным» в том смысле, что он сопоставляет длинные участки фигурных скобок вместе, но в итоге он соотносит фигурные скобки функций в одной версии с фигурными скобками следующей более поздней функции в другой версии. Эта ситуация очень уродливая и может привести к совершенно непригодному файлу конфликта в ситуации, когда вам нужно, чтобы такие вещи были представлены наиболее согласованно.
Алгоритм измерения терпения - это более медленный алгоритм сравнения, который в некоторых случаях показывает лучшие результаты.
Предположим, у вас есть следующий файл, зарегистрированный в 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 исследуются различные эвристики. .
Обратите внимание, что алгоритм разности терпения все еще имеет некоторые известные патологические случаи .