git apply

Nakłada zmiany z pliku patcha na drzewo robocze.

git apply bierze plik patcha (czyli wynik git diff albo diff -u) i nakłada zawarte w nim zmiany na Twoje drzewo robocze. W przeciwieństwie do git am nie tworzy commita ani nie dotyka historii — po prostu modyfikuje pliki tak, jakbyś wkleił je ręcznie, tylko bez bólu. Używasz go, gdy ktoś przysłał Ci łatkę mailem, gdy chcesz przetestować poprawkę z internetu, albo gdy przerzucasz zmiany między gałęziami bez cherry-picka.

Składnia i najważniejsze opcje

Podstawowa forma to git apply [opcje] . Bez pliku czyta patch ze standardowego wejścia.

  • --check — tylko sprawdza, czy patch da się nałożyć; niczego nie zmienia. Twój najlepszy przyjaciel przed faktycznym zastosowaniem.
  • --stat — pokazuje podsumowanie zmian (które pliki, ile linii), bez nakładania.
  • -R, --reverse — odwraca patch, czyli cofa zmiany, które wcześniej nałożyłeś.
  • --index — nakłada zmiany na drzewo robocze i od razu na staging (indeks).
  • --cached — modyfikuje wyłącznie indeks, bez dotykania plików na dysku.
  • --3way (lub -3) — przy konflikcie próbuje scalenia trójstronnego i zostawia markery konfliktu zamiast się poddać.
  • -p — usuwa n początkowych segmentów ze ścieżek w patchu (domyślnie -p1).
  • --reject — nakłada co się da, a fragmenty nieudane zapisuje do plików .rej zamiast przerywać całość.

Przykłady użycia

  • git apply --check zmiany.patch — suchy przebieg: sprawdzasz, czy łatka w ogóle pasuje, zanim cokolwiek ruszysz.
  • git apply zmiany.patch — nakłada zmiany na pliki w drzewie roboczym (zmiany pozostają niezastage’owane).
  • git apply --index zmiany.patch — nakłada i od razu dodaje do staging, gotowe do commita.
  • git apply -R zmiany.patch — cofa wcześniej nałożoną łatkę, gdy okazała się nietrafiona.
  • git diff > moja.patch a potem git apply --stat moja.patch — zapisujesz własne zmiany do pliku i podglądasz ich zakres przed przeniesieniem gdzie indziej.

Częste błędy i pułapki

Najczęstszy komunikat to patch does not apply — zwykle oznacza, że pliki w repo zmieniły się od momentu utworzenia łatki. Zacznij od --check, a przy realnych konfliktach sięgnij po --3way, które zostawi markery do ręcznego rozwiązania. Druga klasyka to złe poziomy ścieżek: jeśli patch tworzono w innym katalogu, dobierz -p0 lub -p2. Pamiętaj, że git apply jest restrykcyjny — domyślnie albo nakłada całość, albo nic; dopiero --reject pozwala na częściowy sukces z plikami .rej. I nie myl go z git am ani patch z systemu — tu nie ma commita ani autora, są wyłącznie zmiany w plikach.

Powiązane komendy: git diff, git am, git format-patch, git cherry-pick, patch.