Для чого "git diff - терпіння"?


219

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


1
Можливо, він відповідає переміщеному коду та модифікованим рядкам, які можуть бути набагато повільнішими
codymanix

Я вилучив окремий сценарій для Patience Diff з Bazaar, ви можете знайти його в іншій темі SO .
TryPyPy

38
Подальше запитання. Коли я не повинен використовувати терпіння різного?
балки

4
Існує також --histogramпараметр, який "... розширює алгоритм терпіння на" підтримку загальних елементів із низькою частотою зустрічі
Роберт

Відповіді:


183

Ви можете прочитати публікацію від Брема Коена , автора алгоритму терпіння різниці, але я знайшов цю публікацію в блозі, щоб дуже добре узагальнити алгоритм терпіння різниці:

Натомість терпіння Diff зосереджує свою енергію на низькочастотних лініях з високим вмістом, які служать маркерами або підписами важливого вмісту в тексті. Це все ще є основою LCS, що є основою, але з важливою відмінністю, оскільки вона розглядає лише найдовшу загальну послідовність рядків підписів:

Знайдіть усі рядки, які трапляються рівно один раз на обидві сторони, а потім зробіть найдовший загальний підряд на цих лініях, співставляючи їх.

Коли слід використовувати терпіння різниці? За словами Брема, для цієї ситуації добре терпіння:

Дійсно погані випадки - це випадки, коли дві версії різко розходилися, і розробник не дбає про те, щоб тримати під контролем розміри патчів. За таких обставин алгоритм розрізнення може періодично бути «нерівним», оскільки він відповідає довгим ділянкам фігурних дужок разом, але він завершує співвіднесення фігурних дужок функцій в одній версії з фігурними дужками наступної пізнішої функції в іншій версії. Ця ситуація є дуже потворною , і може призвести до абсолютно непридатного файлу конфлікту в ситуації, коли потрібні такі речі, щоб їх було представлено більш повно.


3
На мій досвід роботи з XML на даний момент, він дає точно такі ж «погані» результати, як і звичайний розл.
stivlo

5
Я мав набагато більше удачі з терпінням, відмінним від XML; звичайно, розгляд, на який я зараз дивлюся, має саме проблему нерівності, описану за допомогою звичайного алгоритму diff, але виглядає абсолютно великим з терпінням розл.
me_and

22
У цьому блозі є чудове пояснення, включаючи анімовані gif цього процесу: alfedenzo.livejournal.com/170301.html
Quantum7

3
Я вважаю цей блог дуже цікавим і надає гарне пояснення з подальшими посиланнями на деталі алгоритмів: fabiensanglard.net/git_code_review/diff.php Сподіваюся, він буде комусь корисний
SathOkh

Різницю frobnitz / fib / факт можна побачити на сайті gist.github.com/roryokane/6f9061d3a60c1ba41237
Джордж В. Рейлі

52

Ви також можете використовувати його для злиття (тут справді добре працювали деякі конфлікти XML):

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

51
Або черезgit config --global diff.algorithm patience
Tobu

11
Коротше було б git merge -X patience.
PythonNut

42

Алгоритм терпіння різниці - це більш повільний алгоритм, який показує кращі результати в деяких випадках.

Припустимо, у вас встановлений такий файл, щоб увімкнути 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 вивчає діючу евристику далі .

Зауважимо, що алгоритм терпіння різкості все ще має деякі відомі патологічні випадки .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.