Jaka jest różnica między git am i git apply?

134

Oba git ami git applymogą być używane do nakładania łat. Nie widzę różnicy. Teraz widzę różnicę: git amautomatycznie zatwierdza, podczas gdy git applydotyka tylko plików, ale nie tworzy zatwierdzenia. Czy to jedyna różnica?

Christoph
źródło
11
ammoże być traktowane jako skrót od Apply Mail...
Philip Oakley,

Odpowiedzi:

144

Zarówno wejście, jak i wyjście są różne:

  • git apply pobiera łatkę (np. wyjście git diff ) i stosuje je do katalogu roboczego (lub indeksu, jeśli --indexalbo --cachedjest używany).
  • git ampobiera skrzynkę zatwierdzeń sformatowanych jako wiadomości e-mail (np. dane wyjściowe git format-patch) i stosuje je do bieżącej gałęzi.

git amużywa git applyza kulisami , ale wykonuje więcej pracy przed (odczytywanie Maildirlub mboxi analizowanie wiadomości e-mail) i po (tworzenie zatwierdzeń).

georgebrock
źródło
6
Uwaga: git applywydaje się, że akceptuje również git format-patchdane wyjściowe.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
7
git applydziałałyby również dla danych wyjściowych z, git format-patchale zmiany byłyby niestabilne i musiałyby zostać zatwierdzone (tworząc w ten sposób inny punkt zatwierdzenia w indeksie, do którego są stosowane). Z git amtobą przenosisz informacje o zatwierdzeniu (wraz z autorem itp.) Do indeksu, do którego jest stosowany. git applynastępnie służy do łatania repozytorium (złe), git ammoże wprowadzić uzasadnione zmiany funkcji i dołączyć je do repozytorium (preferowane podejście).
Prasoon Joshi
18

git applysłuży do stosowania prostych różnic (np. z git diff), podczas gdy git amsłuży do nakładania łat i sekwencji łatek z e-maili, w formacie mbox lub Maildir i jest „przeciwieństwem” git format-patch. git ampróbuje wyodrębnić informacje o zatwierdzeniach i dane autora z wiadomości e-mail, dlatego może dokonywać zatwierdzeń.

CB Bailey
źródło
9

Po git amzastosowaniu łatki, jeśli używasz git status, nie zobaczysz żadnych lokalnych zmian.

git applyumożliwia wprowadzanie zmian w plikach źródłowych tak, jakbyś sam pisał kod, w konsekwencji git statusi git diffwypisze zmiany wprowadzone w łatce, którą zastosowałeś, następnie możesz naprawić / dodać więcej zmian i przesłać je razem jako jedną nową łatkę .

0x90
źródło