Jaka jest różnica między „git format-patch” i „git diff”?

92

Nie widzę różnicy między danymi wyjściowymi „git format-patch” i „git diff”, czy jest jakaś? I czy nie będę mógł użyć „git diff” do stworzenia łatki, a następnie zaaplikowania jej za pomocą git apply?

Mój problem polega na tym, że mam zmiany dodane do indeksu, ale najwyraźniej git format-patch akceptuje tylko zatwierdzenia, więc jeśli mogę użyć wyjścia diff, mogę użyć tego polecenia, aby utworzyć łatkę dla zmian w indeksie:

git diff --cached > index.patch
Rafid
źródło

Odpowiedzi:

130

Łata utworzona za pomocą git format-patchbędzie również zawierała pewne metainformacje o zatwierdzeniu (autor zatwierdzający, data, komunikat o zatwierdzeniu, ...) i będzie zawierać różnice danych binarnych. Wszystko zostanie sformatowane jako poczta, aby można było łatwo wysłać. Osoba, która go otrzyma, może następnie odtworzyć odpowiednie zatwierdzenie z, git ama wszystkie metadane pozostaną nienaruszone. Można go również zastosować, git applyponieważ jest to super zestaw prostych różnic.

Łatka wypełniona git diffbędzie prostą różnicą z kontekstem (pomyśl diff -u). Można go również zastosować, git applyale metadane nie zostaną odtworzone (ponieważ nie są obecne).

Podsumowując, git format-patchprzydaje się do przesyłania zatwierdzenia, a git diffprzydaje się do uzyskiwania różnic między dwoma drzewami.

Sylvain Defresne
źródło
13

Na podstawie podręczników git-format-patch przygotowuje łaty odpowiednie do przesyłania e-mailem, podczas gdy git-diff pokazuje zmiany.

Są to dwie różne rzeczy i mają różne cele, po prostu wypisują format łaty. Ale git-format-patchdodaje dane o zatwierdzeniu (data, autor, komunikat o zatwierdzeniu) i łączy je w format, który jest odpowiedni do wysyłania jako wiadomości e-mail w systemie Unix (chociaż są to tylko pliki, więc mogą być wysyłane innymi metodami i nadal stosowane przez git-am).

Również git-format-patchgeneruje plik poprawki dla każdego popełnić w zakresie, który można określić. Te zmiany zostaną dodane jako zatwierdzenia do repozytorium z git-am.

git-diffpokazuje tylko różnicę między dwoma stanami, o które prosisz, i może być użyty do stworzenia pliku łatki. Ale to tylko zwykły plik poprawki, a zastosowanie poprawki zmieni tylko stan katalogu roboczego.

I tak, w ten sposób możesz stworzyć łatkę dla swojego indeksu.

Abizern
źródło
Dzięki. Co jest szczególnego w poczcie UNIX, skoro zaprojektowali na jej podstawie poprawkę?
Rafid,
7
Nie ma nic specjalnego. Chodzi o to, że git został zaprojektowany przez Linusa Torvaldsa, którego przepływ pracy obejmował wysyłanie i odbieranie poprawek pocztą elektroniczną w celu weryfikacji przed integracją z jądrem Linuksa.
Sylvain Defresne,
Git został zaprojektowany przez Linusa Torvaldsa w celu utrzymania jądra Linuksa. Poczta uniksowa była powszechnym formatem.
Abizern,
1

Plik poprawki można wygenerować za pomocą git diffpolecenia, ale w porównaniu z łatą wygenerowaną przez git format-patchpolecenie, główne różnice to:

  1. Brak metadanych o zatwierdzeniu (takich jak data, autor, komunikat o zatwierdzeniu itp.);
  2. Brak statystyk dotyczących różnic (diffstat, takie jak zmienione pliki x, wstawienia y (+), usunięcia z (-));
  3. Brak różnic binarnych, tylko różnice tekstowe.

wprowadź opis obrazu tutaj

Aby wygenerować plik poprawki dla wszystkich zmienionych plików (w indeksie lub katalogu roboczym):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Aby zastosować wygenerowany plik poprawki:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
K. Symbol
źródło