Qual è la differenza tra "git format-patch e" git diff "?


92

Non vedo alcuna differenza tra l'output di "git format-patch" e "git diff", ce n'è? E non sarò in grado di usare "git diff" per produrre una patch e poi applicarla usando git apply?

Il mio problema è che ho modifiche aggiunte all'indice, ma apparentemente git format-patch accetta solo commit, quindi se posso usare l'output di diff, allora posso usare questo comando per produrre una patch per le modifiche nell'indice:

git diff --cached > index.patch

Risposte:


129

Una patch creata con git format-patchincluderà anche alcune meta-informazioni sul commit (committer, data, messaggio di commit, ...) e conterrà diff di dati binari. Tutto sarà formattato come una mail, in modo che possa essere facilmente inviato. La persona che lo riceve può quindi ricreare il commit corrispondente con git ame tutti i metadati saranno intatti. Può anche essere applicato git applyin quanto è un super-set di un semplice diff.

Una patch creata con git diffsarà un semplice diff con contesto (pensa diff -u). Può anche essere applicato con, git applyma i metadati non verranno ricreati (poiché non sono presenti).

In sintesi, git format-patchè utile per trasmettere un commit, mentre git diffè utile per ottenere un diff tra due alberi.


12

Dai manuali git-format-patch prepara le patch adatte per l'invio di email, mentre git-diff mostra le modifiche.

Sono due cose diverse e hanno scopi diversi, capita solo che producano un formato patch. Ma git-format-patchaggiunge i dati su un commit (data, autore, messaggio di commit) e lo raggruppa in un formato adatto per l'invio come messaggio di posta Unix (sebbene questi siano solo file, quindi possono essere inviati ad altri metodi e ancora applicati da git-am).

git-format-patchGenera anche un file di patch per ogni commit nell'intervallo specificato. Queste modifiche verranno aggiunte come commit al tuo repository con git-am.

git-diffmostra solo la differenza tra i due stati richiesti e può essere utilizzato per creare un file di patch. Ma questo è solo un normale file di patch e l'applicazione della patch cambierà solo lo stato della directory di lavoro.

E sì, puoi creare una patch per il tuo indice in questo modo.


Grazie. Cosa c'è di speciale nella posta UNIX in modo che abbiano progettato la patch basandosi su di essa?
Rafid

7
Non c'è niente di veramente speciale. Questo è solo che git è stato progettato da Linus Torvalds il cui flusso di lavoro prevedeva l'invio e la ricezione di patch via e-mail per la convalida prima dell'integrazione nel kernel Linux.
Sylvain Defresne

Git è stato progettato da Linus Torvalds per mantenere il kernel Linux in. La posta Unix era un formato comune.
Abizern

1

Il file della patch può essere generato con il git diffcomando, ma confrontando con la patch generata dal git format-patchcomando, le principali differenze sono:

  1. Nessun metadato su un commit (come data, autore, messaggio di commit, ecc.);
  2. Nessuna statistica sul diff (diffstat, come x file modificati, y inserzioni (+), z eliminazioni (-));
  3. Nessun diff binario, solo diff testuali.

inserisci qui la descrizione dell'immagine

Per generare il file di patch per tutti i file modificati (nell'indice o nella directory di lavoro):

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

Per applicare il file di patch generato:

# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.