Jak działają algorytmy diff
Każdy widok diff na tej stronie jest produkowany przez algorytm Myersa — technikę z 1986 roku autorstwa Eugene’a W. Myersa, która znajduje najkrótszy skrypt edycji między dwoma sekwencjami tokenów w czasie O((N+M)D), gdzie D to odległość edycji. Algorytm opiera się na problemie Najdłuższego Wspólnego Podciągu, a silnik działa w całości w przeglądarce za pomocą biblioteki open-source jsdiff.
- Tokenizacja wejść — Przed porównaniem algorytm dzieli każde wejście na sekwencję tokenów. Ziarnistość linii dzieli według znaków nowej linii; ziarnistość słów dzieli według granic białych znaków i interpunkcji; ziarnistość znaków traktuje każdy punkt kodowy Unicode jako własny token.
- Budowanie grafu edycji — Algorytm Myersa modeluje porównanie jako ścieżkę przez siatkę 2D, gdzie ruch w prawo oznacza „usuń z oryginału”, ruch w dół oznacza „wstaw ze zmienionego”, a ruch po przekątnej oznacza „token pasuje w obu”. Algorytm znajduje najkrótszą ścieżkę z dużą liczbą ruchów po przekątnej.
- Wyodrębnienie NWP — Ruchy po przekątnej na najkrótszej ścieżce śledzą Najdłuższy Wspólny Podciąg — tokeny, które pojawiają się w obu wejściach w tym samym względnym porządku. Każdy token w NWP jest „niezmieniony”; wszystko inne to dodanie lub usunięcie.
- Zastosowanie opcji przetwarzania wstępnego — Jeśli włączysz „Ignoruj wielkość liter”, oba wejścia są zamieniane na małe litery przed przebiegiem NWP, dzięki czemu „HELLO” i „hello” są traktowane jako identyczne. „Ignoruj białe znaki” składa wielokrotne spacje w jedną. „Przytnij każdą linię” usuwa wiodące i końcowe białe znaki z każdej linii przed porównaniem.
- Renderowanie wybranego widoku — Wynik to ten sam wynik NWP wyświetlany na trzy sposoby: Obok siebie pokazuje oryginał po lewej i zmieniony po prawej w siatce dwukolumnowej z czerwonymi i zielonymi podkreśleniami wierszy. Zunifikowany pokazuje pojedynczą kolumnę z wierszami z prefiksem − i +, jak wynik
git diff. Inline pokazuje usunięcia jako czerwone przekreślenia i dodania jako zielone podkreślenia w tym samym przepływie tekstu. - Obliczanie paska podsumowania — Po renderowaniu narzędzie zlicza, ile tokenów zostało dodanych, usuniętych i zachowanych, a następnie oblicza podobieństwo jako stosunek niezmiennych tokenów do większego z dwóch długości wejść. Podobieństwo 100% oznacza, że wejścia są identyczne po przetwarzaniu wstępnym.
Dlaczego warto używać porównywrki tekstu
- Recenzja kodu bez klienta Git — Wklej dwie wersje pliku konfiguracyjnego, migracji SQL lub skryptu powłoki i sprawdź, co się zmieniło, bez klonowania repozytorium, przełączania gałęzi lub czekania na pipeline CI. Narzędzie jest przydatne do szybkich recenzji podczas programowania w parach, dla handoffów kontrahentów, gdzie druga strona nie udostępniła historii Git, oraz dla starszych baz kodu, które poprzedzają w ogóle kontrolę wersji. Widok zunifikowany produkuje wynik, który możesz skopiować wprost do wątku czatu lub zgłoszenia.
- Śledzenie zmian w umowach i dokumentach — Diff na poziomie słów pokazuje, które terminy zmieniły się między wersjami roboczymi umów szybciej niż panel Śledzenia zmian w Wordzie. Wklej klauzulę A z pierwszej wersji roboczej i klauzulę B z podpisanej kopii, a podstawienie podświetli się czerwono-zielono dokładnie we frazie, która się zmieniła. Prawnicy i zespoły zakupowe używają tego do weryfikacji, że ostatniominiczne zmiany nie umknęły przed podpisaniem umowy.
- Rewizje esejów i szkiców — Pisarze porównujący pierwszy szkic z wersją po redakcji mogą przełączyć się na ziarnistość słów, aby zobaczyć każde podstawienie, wstawienie i skrót bez ponownego czytania obu kopii. Ten sam przepływ pracy działa dla tłumaczy audytujących zmiany względem tekstu źródłowego, dla redaktorów sprawdzających, czy poprawka zachowała głos autora, oraz dla dziennikarzy uzgadniających opublikowany artykuł ze złożonym szkicem.
- Porównanie dzienników i konfiguracji — Administratorzy systemów porównujący dwie migawki konfiguracji serwera, dwa harmonogramy cron lub dwa wyniki
ps auxmogą użyć ziarnistości linii, aby zlokalizować w sekundy pojedynczy zmieniony parametr w 200-wierszowym pliku. W połączeniu z opcją Ignoruj-białe-znaki głośny diff dotyczący tylko wyrównania redukuje się do zmian parametrów, które faktycznie mają znaczenie.
Typowe zastosowania
Diff tekstu pojawia się na końcu każdego cyklu edycji w pracy pisarskiej, programistycznej i operacyjnej.
- Recenzja pull requestu: wklej dwie implementacje funkcji obok siebie, aby zrozumieć zmianę logiki przed zatwierdzeniem, bez konieczności checkoutu gałęzi.
- QA internacjonalizacji: porównaj angielski ciąg źródłowy z jego tłumaczonym odpowiednikiem na poziomie słów, aby wykryć wstawienia, pominięcia lub zamiany terminologii, które tłumacz mógł wprowadzić.
- Analiza incydentów: porównaj dwie migawki manifestu Kubernetes lub dwa wyniki „docker inspect” na poziomie linii, aby wyizolować zmianę konfiguracji poprzedzającą awarię.
Przykład praktyczny
Weź pięciowierszową konfigurację serwera. Oryginał: host=localhost, port=5432, dbname=app_db, user=app, password=secret. Zmieniony: host=db.prod.example.com, port=5432, dbname=app_db, user=app_prod, password=secret. W widoku obok siebie z ziarnistością linii, linia 1 pokazuje czerwoną po lewej (host=localhost) i zieloną po prawej (host=db.prod.example.com), linia 4 pokazuje czerwoną (user=app) i zieloną (user=app_prod), a linie 2, 3 i 5 pozostają niezmienione po obu stronach. Pasek podsumowania informuje o 2 dodaniach, 2 usunięciach, 3 niezmienione i podobieństwie 60% — trzy z pięciu linii zachowane. Przełącz na ziarnistość słów, a diff zacieśnia się jeszcze bardziej: podświetlają się tylko wartości po prawej stronie znaku = w liniach 1 i 4, klucze pozostają niezmienione, a podobieństwo rośnie do około 85%, ponieważ NWP teraz liczy host, user i otaczające znaki interpunkcyjne jako zachowane.
Czy to działa w mojej przeglądarce?
Tak. Cała analiza diff działa po stronie klienta za pomocą biblioteki open-source jsdiff załadowanej ze stroną. Nic, co wpisujesz, wklejasz lub porównujesz, nie jest wysyłane na żaden serwer. Możesz to zweryfikować samodzielnie: otwórz DevTools przeglądarki, przełącz na zakładkę Sieć, wyczyść dziennik, kliknij Porównaj i potwierdź, że zero żądań sieciowych nie jest uruchomionych dla kroku porównania.
Co oznacza procent podobieństwa?
Podobieństwo jest obliczane jako niezmienione tokeny / max(całkowita liczba tokenów w oryginale, całkowita liczba tokenów w zmienionym). Wynik 100% oznacza, że dwa wejścia są identyczne po zastosowaniu opcji przetwarzania wstępnego (składanie wielkości liter, zwijanie białych znaków, przycinanie linii). Wynik 0% oznacza, że żaden token nie jest współdzielony między wejściami. Metryka to przybliżenie odległości edycji — przydatne jako szybki wskaźnik — a nie wynik plagiatyzmu lub oryginalności.
Czy mogę semantycznie porównywać JSON / YAML / XML?
Nie w tym narzędziu. To diff na poziomie tekstu, więc reformatowanie JSON lub XML polegające tylko na białych znakach nadal pokazuje wiele zmian, nawet gdy dane są logicznie identyczne. Zmiana kolejności kluczy obiektów w JSON jest również pokazywana jako zmiany, mimo że większość parserów traktuje kolejność kluczy jako nieistotną. Do prawdziwego semantycznego diffu, który porównuje sparsowane drzewa obiektów i ignoruje kolejność kluczy oraz formatowanie, planujemy dedykowane narzędzie do diffu JSON. Na razie przed wklejeniem tutaj znormalizuj oba wejścia do tego samego wcięcia i kolejności kluczy.
Jak różnią się widoki zunifikowany i obok siebie?
Obok siebie renderuje dwie kolumny: oryginał po lewej i zmienioną wersję po prawej, z usuniętymi liniami podświetlonymi na czerwono po lewej i dodanymi liniami podświetlonymi na zielono po prawej. Niezmienione linie pojawiają się w obu kolumnach wyrównanych w tym samym wierszu. Zunifikowany renderuje pojedynczą kolumnę z prefiksem − i czerwonym tłem dla usuniętych linii oraz prefiksem + i zielonym tłem dla dodanych — ten sam układ, który git diff drukuje w terminalu. Używaj zunifikowanego, gdy chcesz skopiować wynik jako plik łatki lub wkleić go do wątku recenzji kodu. Używaj obok siebie, gdy wizualne wyrównanie tego, co co zastąpiło, jest ważniejsze niż surowy tekst łatki.
Wklej oryginał po lewej, zmienioną wersję po prawej, wybierz widok i ziarnistość, a porównanie pojawi się w milisekundach. Włącz tryb na żywo, a diff ponownie się uruchomi przy każdym naciśnięciu klawisza podczas edycji którejkolwiek strony. Pobierz wynik jako standardowy zunifikowany plik .patch, który git apply przyjmuje bezpośrednio. Bez przesyłania, bez konta, bez klucza API dostawcy, bez limitu.