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.
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.
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ś
--histogram
parametr, 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.htmlOdpowiedzi:
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:
Kiedy należy stosować diff cierpliwości? Według Bram różnice w cierpliwości są dobre w tej sytuacji:
źródło
Możesz także użyć go do scalania (działał tutaj bardzo dobrze w przypadku niektórych konfliktów XML):
źródło
git config --global diff.algorithm patience
git merge -X patience
.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:
Teraz zmieniamy kolejność sekcji i dodajemy nowy wiersz:
Domyślny algorytm różnicowy twierdzi, że nagłówki sekcji uległy zmianie:
Podczas gdy różnice w cierpliwości pokazują wynik, który jest prawdopodobnie bardziej intuicyjny:
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 .
źródło