Do czego służy „git diff --patience”?

219

Czym algorytm cierpliwości różni się od git diffalgorytmu domyślnego i kiedy chciałbym go użyć?

Gabe Moothart
źródło
1
Może pasuje do przesuniętego kodu i zmodyfikowanych linii, które mogą być znacznie wolniejsze
codymanix
Wyodrębniłem samodzielny skrypt dla Patience Diff z Bazaar, można go znaleźć w innym wątku SO .
TryPyPy,
38
Dalsze pytanie. Kiedy nie powinienem używać diff cierpliwości?
balki
4
Istnieje również --histogramparametr, który „... rozszerza algorytm cierpliwości na„ obsługę elementów wspólnych o niskiej częstotliwości występowania ” git-scm.com/docs/git-diff.html
Robert

Odpowiedzi:

183

Możesz przeczytać post od Brama Cohena , autora algorytmu diff cierpliwości, ale znalazłem ten post na blogu, który bardzo dobrze podsumowuje algorytm diff cierpliwości:

Zamiast tego Patience Diff koncentruje swoją energię na liniach o wysokiej częstotliwości o niskiej częstotliwości, które służą jako znaczniki lub podpisy ważnych treści w tekście. W dalszym ciągu jest to oparty na LCS diff, ale z istotną różnicą, ponieważ bierze pod uwagę tylko najdłuższą wspólną podsekwencję linii podpisu:

Znajdź wszystkie linie, które występują dokładnie raz po obu stronach, a następnie wykonaj najdłuższe wspólne podsekwencje na tych liniach, dopasowując je.

Kiedy należy stosować diff cierpliwości? Według Bram różnice w cierpliwości są dobre w tej sytuacji:

Naprawdę złe przypadki to takie, w których dwie wersje dramatycznie się rozeszły, a deweloper nie stara się kontrolować rozmiarów łatek. W takich okolicznościach algorytm różnicowy może czasami zostać „niedopasowany”, ponieważ dopasowuje do siebie długie odcinki nawiasów klamrowych, ale ostatecznie koreluje nawiasy klamrowe funkcji w jednej wersji z nawiasami klamrowymi kolejnej późniejszej funkcji w drugiej wersji. Ta sytuacja jest bardzo brzydka i może doprowadzić do całkowicie bezużytecznego pliku konfliktu w sytuacji, gdy potrzebujesz takich rzeczy, aby były spójnie prezentowane najbardziej.

Mark Rushakoff
źródło
3
Z mojego dotychczasowego doświadczenia z XMLem daje dokładnie takie same „złe” wyniki jak normalny diff.
stivlo
5
Miałem dużo więcej szczęścia z różnicami w cierpliwości z XML; z pewnością różnicę, na którą patrzę, ma dokładnie problem z niewspółosiowością opisany przy użyciu zwykłego algorytmu różnicowania, ale wygląda absolutnie wspaniale z różnicą cierpliwości.
me_and
22
Ten blog ma świetne wyjaśnienie, w tym animowany gif procesu: alfedenzo.livejournal.com/170301.html
Quantum7
3
Uważam, że ten blog jest bardzo interesujący i zapewnia dobre wyjaśnienie z dalszymi linkami do szczegółów algorytmów: fabiensanglard.net/git_code_review/diff.php Mam nadzieję, że będzie przydatny dla kogoś
SathOkh
Frobnitz / fib / fact diff można zobaczyć na stronie gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly,
52

Możesz także użyć go do scalania (działał tutaj bardzo dobrze w przypadku niektórych konfliktów XML):

git merge --strategy-option=patience ...
robinst
źródło
51
Lub viagit config --global diff.algorithm patience
Tobu,
11
Byłby krótszy git merge -X patience.
PythonNut
42

Algorytm diff cierpliwości jest wolniejszym algorytmem diff, który w niektórych przypadkach pokazuje lepsze wyniki.

Załóżmy, że w git zarejestrowano następujący plik:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Teraz zmieniamy kolejność sekcji i dodajemy nowy wiersz:

.bar {
    margin: 0;
}

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

Domyślny algorytm różnicowy twierdzi, że nagłówki sekcji uległy zmianie:

$ 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;
 }

Podczas gdy różnice w cierpliwości pokazują wynik, który jest prawdopodobnie bardziej intuicyjny:

$ 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;
+}

Jest tutaj dobra dyskusja na temat subiektywnej jakości różnic , a git 2.11 dalej analizuje heurystykę różnic .

Zauważ, że algorytm różnicy cierpliwości wciąż ma znane przypadki patologiczne .

Wilfred Hughes
źródło