Shared
VPS
Dedicated
WP Professional
WP Professional Plus
Narzędzie „diff” oblicza różnice pomiędzy dwoma plikami tekstowymi. Ta różnica jest nazywana poprawką. Możesz zastosować poprawkę do innego pliku używając narzędzia „patch”.
diff i patch są przeznaczone do użycia na plikach tekstowych. Pliki, które są binarne lub manipulowane przez specjalnie do tego celu stworzone aplikacje, takie jak .doc, .pdf, .xlsx, lub .wav, nie działają dobrze z diff i patch.
Dlaczego używać diff i patch?
Powód 1: diff może być użyteczny sam w sobie, aby zobaczyć co się zmieniło pomiędzy plikami, nawet jeśli nigdy nie używasz patch.
Powód 2: Czasami możesz otrzymać łatki od osób trzecich i zastosować je do swoich plików. Może to być korzystne w przypadkach, gdy łatane pliki są duże, ale liczba zmian jest stosunkowo niewielka: przesyłanie pliku z łatą jest bardziej efektywne niż przesyłanie całego pliku.
Powód 3: Możesz zastosować łatę do plików, które nie są idealnie zgodne z oryginalnym plikiem użytym w diff.
Na przykład, jeśli używasz CMS z plikiem konfiguracyjnym i dokonujesz lokalnych modyfikacji w tym pliku, chcesz zachować te lokalne zmiany, gdy uaktualnisz CMS. Skopiowanie nowej konfiguracji dostawcy na swoją wersję spowoduje utratę zmian. Jednak w wielu przypadkach można bezpiecznie użyć łatki, aby zastosować zmiany dostawcy z najnowszej wersji bez utraty własnych zmian.
Co to jest diff?
Diff jest sposobem porównywania plików w poszukiwaniu różnic (stąd nazwa „diff”) z linii poleceń. Na przykład, jeśli masz oryginalny plik, następnie dokonujesz pewnych zmian i zapisujesz go pod inną nazwą, możesz porównać te dwa pliki używając diff.
Składnia diffa
Składnia diffa jest używana w wierszu poleceń. Podstawowa składnia diff wygląda następująco:
diff
To polecenie ustawia podstawową strukturę porównywania jednego pliku do drugiego. Istnieją również opcje, aby dodać więcej funkcjonalności do polecenia.
Podstawowa składnia (bez opcji)
Zastąp i rzeczywistymi nazwami plików. Pamiętaj, aby dołączyć rozszerzenia plików do ich nazw. Podstawowe polecenie diff bez opcji może wyglądać jak poniżej:
diff file1.html file2.html
W tym przykładzie polecenie porówna plik1.html i plik2.html i wypisze różnice do wiersza poleceń.
Składnia polecenia diff (z opcjami)
Opcje polecenia diff dodają więcej funkcjonalności do poleceń. Jednakże, opcje zmienią nieco składnię polecenia.
Opcje dyf przechodzą pomiędzy diff a pierwszą nazwą pliku:
diff -y file1.html file2.html
Możesz także połączyć wiele opcji w jednym poleceniu. Zrób to dodając wszystkie odpowiednie litery opcji po myślniku (-). Będzie to wyglądać mniej więcej tak:
diff -uy file1.html file2.html
Możesz również zobaczyć odmianę, która daje każdej opcji jej własny myślnik (-). Obie metody dodawania wielu opcji są ważne
diff -u -y file1.html file2.html
Patrz poniżej, aby zapoznać się z listą często używanych opcji:
Opcja | Opis |
-.N | Ignores absent files |
-r | Recursively executes diff through a directory. Używane do porównywania wielu plików naraz. Uwaga: to nie to samo co -R, które jest opcją poprawki |
-u | Wyświetla dane wyjściowe w formacie łatwiejszym do odczytania. Może to usunąć niektóre informacje, takie jak linie kontekstowe. |
-y | Wymusza wyświetlanie różnic obok siebie. |
Więcej opcji, zobacz tę listę opcji diff przez GNU.
Wyjście dyf
Po uruchomieniu polecenia diff, podstawowe wyjście będzie wyglądało podobnie do tego:
Użycie opcji -y zmieni sposób wyświetlania danych wyjściowych
11c11< this is text from the original file---> this is the same line from the second, changed file
Wyłącznie zmiany będą wyświetlane na wyjściu, więc nie musisz przekopywać się przez dwa pliki. Zamiast tego, diff porównuje i wyciąga zmiany, abyś mógł je zobaczyć.
Znaki „>” i „<” w wyjściu diff wskazują kierunek pliku, w którym znajduje się zawartość. Tak więc, dla polecenia „diff file1 file2”, znak „<” odnosi się do linii z pliku1, a „>” odnosi się do linii z pliku2.
Jak czytać dane wyjściowe diffa
Oto krótki przewodnik po czytaniu danych wyjściowych diffa.
Pierwszy wiersz wyjścia
Pierwszy wiersz wyjścia wskazuje numery wierszy, które zawierają różnice oraz typ zmian, jakie zostały wprowadzone.
Jeśli dwie liczby są oddzielone przecinkiem, oznacza to, że zmiany zostały wprowadzone od pierwszego do drugiego numeru wiersza. W powyższym przykładzie, 11,12 oznaczałoby, że zmiany są w liniach 11 – 12.
The „c”, który oddziela numery linii w powyższym przykładzie wskazuje typ zmiany, która wystąpiła. Istnieją różne litery, które wskazują na różne rodzaje zmian:
Literka | Znaczenie |
c | Treść została zastąpiona |
a | Treść została dodana lub dołączona |
d | Treść została usunięta |
Przy użyciu patcha, co zostanie wyjaśnione w sekcji Co to jest patch? te litery będą ważne.
Reszta danych wyjściowych
Reszta danych wyjściowych dotyczy rzeczywistych różnic między plikami.
Zmienione linie będą wymienione obok < lub > nawiasów kątowych. Trzy kreski (—) oznaczają, że zmienia się koniec linii pierwszego pliku i początek linii następnego pliku. Będzie to wyglądało tak:
< text from file one---> text from file two
Teraz, gdy masz już podstawowe zrozumienie diff, czas przejść do patch.
Co to jest patch?
patch jest poleceniem, które pobiera dane wyjściowe z diff i umieszcza je w pliku. Następnie, może wziąć plik wyjściowy i nadpisać nim inny plik z wprowadzonymi zmianami. Na przykład, częstym zastosowaniem jest użycie patcha do przeniesienia zmian ze zmienionego pliku do pliku oryginalnego, czyniąc je w ten sposób identycznymi. Chociaż może to być również osiągnięte przez kopiowanie/wklejanie zaktualizowanego pliku do oryginalnego pliku, patch jest znacznie szybszy i wydajniejszy.
Jak używać diff i patch razem
diff działa poprzez katalogowanie zmian pomiędzy dwoma plikami lub folderami. Patch może wziąć te zmiany, umieścić je w pliku i zaktualizować nim starsze wersje.
Opcje patch
Komenda patch ma również swój własny zestaw opcji, aby dodać funkcjonalność. Poniżej znajduje się lista często używanych opcji:
-b | Tworzy kopię zapasową oryginalnego pliku | |
-i | Zmusza polecenie do odczytania poprawki z pliku .patch zamiast ze standardowego wejścia | |
-p | Instruuje polecenie, aby usunęło # liczbę ukośników ze ścieżki do pliku do nazwy pliku. W większości naszych przykładów używamy -p0, aby nie usuwać żadnych ukośników | |
-R | Odwraca poprzednią poprawkę | |
-s | Uruchamia polecenie bezgłośnie. Wyświetli tylko proces, jeśli wystąpią błędy |
Po więcej opcji, zobacz tę listę opcji patcha przez GNU.
Tworzenie patcha
Tworzenie pliku patcha jest pierwszym krokiem do używania patcha i diffa razem. Plik patch może być użyty do dodawania zmian do innych plików, a więc jest niezbędny dla poleceń takich jak Nadpisz oryginalny plik zmianami.
Aby utworzyć plik patch, wpisz poniższe polecenie w wierszu poleceń:
diff -u file1.html file2.html > patchfile.patch
W powyższym przykładzie, wynik działania diff zostanie zapisany w pliku o nazwie patchfile.patch. Wykonując polecenie, pamiętaj, aby zmienić file1.html i file2.html na rzeczywiste nazwy plików.
Nadpisywanie plików zmianami
Po utworzeniu pliku patch, możesz go użyć do skopiowania zmian do innego pliku. Na przykład, możesz chcieć nadpisać plik1 zmianami z uaktualnionego pliku2. Aby to zrobić, mógłbyś użyć składni takiej jak ta:
patch file1.html patchfile.patch
Zastąp plik1.html swoim oryginalnym plikiem. Spowodowałoby to nadpisanie starej zawartości pliku1.html zmienioną zawartością pliku2.html.
Jak odwrócić łatę
Jeśli chcesz przywrócić plik do jego poprzedniej wersji przed łataniem, możesz to zrobić uruchamiając to polecenie:
patch -p0 -R -i patchfile.patch
W wierszu poleceń zostanie wyświetlony monit o wprowadzenie nazwy pliku, który chcesz przywrócić. Gdy nazwa pliku zostanie wprowadzona, rozpocznie się proces odwracania. Jeśli się powiedzie, plik zostanie przywrócony do poprzedniego stanu.
patchowanie katalogów
Używanie diff i patch na całych katalogach jest podobnym procesem do używania ich na pojedynczych plikach.
Pierwszym krokiem jest utworzenie pliku patch za pomocą polecenia:
diff -ruN folder1/ folder2/ > patchfile.patch
Następnie wydasz polecenie patchowania oryginalnego folderu, którym w tym przypadku jest folder1:
patch -s -p0 < patchfile.patch
Jeśli się powiedzie, twój oryginalny katalog powinien być teraz zaktualizowany do drugiego, zaktualizowanego folderu.