2013-02-14 19 views
7

Quindi diciamo che ho un ramo principale, chiameremo "master". Ho creato un ramo, chiamato "nuova funzionalità". Ho fatto un sacco di commit in questo ramo, così posso tornare indietro nel tempo, ma ho fatto un bel po 'di avanti e indietro durante lo sviluppo della funzione in modo che il registro di commit sia piuttosto disordinato.Divisione Git diff in un nuovo commit

Se dovessi dare un'occhiata a git diff master..new-feature per esempio.

Se volevo creare solo un nuovo commit nuovo su "master" che includa tutti i cambiamenti tra i due rami, qual è il modo più efficiente per farlo?

risposta

17
git checkout master 
git merge --squash new-feature 
git commit 

Il messaggio di commit partirà mostrando l'intero elenco di commit essere fuso/schiacciato, ma è possibile, naturalmente, di modifica che ad essere quello che vuoi.

+0

Deliciously simple :) – hhh

1

È possibile utilizzare il rebase interattivo per questo: git rebase --interactive. Quindi usa l'opzione squash. Usa solo gli aggiornamenti dal commit ma non crea il commit.

+0

che sembra come una tonnellata di ricerca di sostituzione scegliere per lo squash , O mi sta sfuggendo qualcosa? – hhh

0

È possibile eseguire il commit di tutto nel proprio branch funzionalità, quindi unire in master accettando "loro" per tutte le modifiche.

Ecco una domanda Stack Overflow con una grande risposta su come farlo: Is there a "theirs" version of "git merge -s ours"?

+0

Hmm, questo si traduce in un solo commit che rappresenta il ramo della funzione? – hhh

+0

Lo farebbe se si rebase nel ramo della funzione per primo (come dice William sopra), anche se questo è forse sconsigliabile. Una delle grandi cose sul controllo del codice sorgente sta avendo la storia di come sei arrivato dove sei. Suppongo che sia una questione di preferenza però! Altro su rebase interattivo [qui] (http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html). –

+0

Sì, mi piacerebbe avere anche la storia, ma gente diversa :) – hhh

1

Usa git rebase --interactive HEAD ~ (tuttavia molti si impegna a voler schiacciare). es., git rebase - INTERATTIVO HEAD ~ 5. Questo caricherà i tuoi ultimi 5 commit e aprirà una finestra di editor con i messaggi. Ogni messaggio avrà 'pick' all'inizio. Vai giù fino all'ultimo messaggio, cambia 'scegli' per 'schiacciare' ed esci. Una nuova finestra si aprirà chiedendo un messaggio di commit. Questo sarà il nuovo messaggio di commit dello squash commits. Esci e schiaccerà tutti i commit in uno nuovo.

C'è un esempio qui: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

Sembra che potrebbe creare qualche problema visto che sono in una squadra e regolarmente ho bisogno di apportare modifiche da altri membri del team. Quello, e preferirei non contare :) – hhh

+0

Se stai lavorando su un ramo di nuove funzionalità, ho pensato che tu stia lavorando su quel ramo da solo. Se non lo sei, tu/le altre persone con cui lavori probabilmente potrebbero avere le loro filiali.L'uso di rebase è in genere una cattiva idea se altre persone hanno già tirato il codice in quanto può causare problemi a causa del fatto che stai riscrivendo la cronologia –

+0

Quindi il ~ 5 non conterà i commit dal master che sono stati fatti che ho tirato dentro, fintanto che sono l'unico a impegnarsi sul ramo? Il "5" indica gli ultimi cinque unici per quel ramo, o gli ultimi cinque si compongono in totale? – hhh

2

Un'altra opzione che potrebbe funzionare meglio per te, sarebbe quella di generare un file di patch con git diff --patch > "patch filename" e quindi applicarlo alle patch nel ramo principale utilizzando git apply "patch file name".

pagina man per git-diff (in particolare "Generazione di patch con -p"): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

pagina man per git-applicano: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

git apply ... interesting :) Buono a sapersi! – hhh