2010-02-07 2 views
35

Vorrei creare una patch per le ultime 2 revisioni.In git, come posso creare una patch singola per le ultime 2+ revisioni?

git format-patch -2 

mi da 2 file di patch, una per ogni revisione

git format-patch HEAD~2..HEAD 

dà la stessa cosa.

git format-patch -1 HEAD~2..HEAD 

dà un singolo file, ma contiene solo le modifiche per l'ultima revisione.

C'è un modo per farlo in git?

+2

Puoi dirci di più sul contesto di ciò che vuoi fare? Sei a conoscenza della capacità di schiacciare i commit insieme a rebase interattivo? Se è così, perché dovresti voler schiacciare una patch che invii ad altri ma non i commit corrispondenti nella tua cronologia? –

+0

@ gbacon: in realtà ho imparato a conoscere rebase subito dopo aver postato questa domanda. Hai ragione che è una soluzione migliore per il mio problema. Tuttavia, non può ferire sapere come farlo. –

+1

@GregBacon: Una cosa che faccio spesso è: lavorare in un ramo di funzionalità, con molti piccoli commit. Quando è il momento di spingere il ramo per padroneggiare, schiacciarlo per primo. Ma nel frattempo, uso 'git diff master mybranch' per inviare una patch per la revisione, pur conservando la mia piccola cronologia di commit (per mio uso personale). –

risposta

41
git diff HEAD~2..HEAD > my-patch.diff 

Tuttavia, non avrà nessuno dei metadati per commit del formato-patch.

+2

Ovviamente. Quale autore dovrebbe avere se questi due commit hanno autori diversi? Come dovrebbe apparire il messaggio di commit per 2-commit change? Etc. –

+0

Si noti che se si usano i rami di feature, si può semplicemente eseguire 'git diff master mybranch> my-patch.diff' per creare una patch per quel ramo. –

0

Si potrebbe fare qualcosa di simile:

 
$ git checkout -b tmp 
$ git reset HEAD~2 
$ git commit -a 

La impegnarsi a ramificarsi tmp sarà lo stesso come l'individuo 2 si impegna.

+0

o 'git rebase -i HEAD ~ 2' e squash. – Tobu

+3

Huh, un voto negativo su una risposta che ha più di 6 anni! Questa è una seria archeologia. Un commento sarebbe stato carino per spiegare la necrofilia. –

+0

Non sono il downvoter, ma suppongo sia perché ci sono modi più facili e sicuri per farlo; 'git reset' può sradicare qualcosa in più. Il rebase fornito in un commento sarebbe un po 'più sicuro in quanto avrebbe almeno indicato se l'albero di lavoro è sporco. Detto questo, penso che questa risposta abbia un valore. – Smar

32

Utilizzare l'opzione --stdout e quindi inviarlo a un file.

Come così:

git format-patch HEAD~2..HEAD --stdout > changes.patch 

Ciò manterrà i metadati per-commit.

+2

Quello che ottieni è un file mbox (file di posta concatenati), non un file di patch. Puoi applicarlo con 'git am'. Non sarai in grado di utilizzare gli strumenti standard per i file di patch. – Tobu

+0

@Tobu: ma spesso si vuole applicare il commit con 'git am', dato che mantiene i commit così come sono, invece di un grosso blob di codice ... – Smar