2011-09-17 13 views
14

Ho appena fatto unCome annullare una git merge squash?

git merge --squash feature-branch 

nel mio develop ramo.

Il problema è che il comando precedente ha aggiornato la testa senza creare un nuovo commit. La mia intenzione era quella di creare un singolo commit da applicare alla testa di develop.

Quindi, in breve, il log per il ramo develop prima e dopo l'unione è esattamente lo stesso.

C'è un modo per ripristinare develop a quello che era prima del git merge?

Grazie.

Soluzione

Sulla base del commento da Dan D. e la risposta accettata seguito sono stato in grado di risolvere il mio problema. Vedi sotto cosa ho fatto nel caso tu sia nella stessa barca:

1 - Ho eseguito git reflog e elencava tutti i commit e i checkout che ho fatto con il mio ramo develop.

2 - Invece di fare un git reset [email protected]{1} come suggerito, ho trovato il numero quando ho eseguito l'ultimo commit da sviluppare che volevo mantenere. Nel mio caso era [email protected]{188}. Quindi ho digitato git reset [email protected]{188}.

3 - Ho eseguito uno git log e aveva un registro pulito che mostra solo i commit che avevo prima di fare l'unione errata.

4 - Ho eseguito git add -A . per mettere in scena tutti i nuovi file creati durante lo sviluppo delle mie funzionalità.

5 - mi sono imbattuto git commit -m "install feature-x"

6 - Come risultato ora ho ramo develop con i file corretti e il registro è pulito - mostrando solo un commit per tutti i cambiamenti che ho fatto durante lo sviluppo di feature-x.

Ho ancora bisogno di scoprire perché il mio originale git merge --squash feature-branch non ha funzionato come previsto.

Soluzione 2

risposta di Marco Longair è una soluzione definitiva al mio problema. L'ho appena testato e funziona. Vedi sotto il processo che sto usando ora di schiacciare tutti i commit interni all'interno di un feature-branch e comprendono un solo impegno al ramo develop:

git checkout develop 
git merge --squash feature-branch 
git commit -m "install of feature-branch" 

La sequenza sopra funziona come un fascino.

+2

Utilizzare 'git reflog'. –

risposta

17

Se si esegue git merge --squash <other-branch>, l'albero di lavoro e l'indice vengono aggiornati con il risultato dell'unione, ma non crea il commit.Tutto quello che dovete fare è eseguire:

git commit 

Tuttavia, se si cambia idea prima di impegnarsi e vogliono solo per interrompere l'unione, è possibile eseguire semplicemente:

git reset --merge 

Non è necessario usare il reflog.

+0

Uau, grazie. Sto lavorando a un nuovo branch e testerò il tuo suggerimento per vedere se funziona. Aggiornerò questa domanda con i risultati Grazie. – jdias

+0

Appena testato e funziona. Grazie Marco. Ho appena aggiornato la mia domanda con la tua risposta. – jdias

+0

+1 Un altro thinko stonato. Grazie! (su una nota un po 'frustrata: questo è perché in git tutti i sottocomandi si comportano leggermente incoerentemente - si fondono, stash apply, checkout con modifiche locali, tutti si comportano diversamente. Per non parlare della pletora di 'git checkout HEAD --' vs.' git checkout HEAD - .', 'git rebase --abort', ma non' git merge --abort', 'git push --all', ma non' git pull --all' e molte istanze sottili come quella :)) – sehe

0

Se si cambia idea prima di impegnarsi, ci sono queste opzioni:

interrompere la fusione con moderna sintassi git:

git merge --abort 

E con la sintassi più vecchio:

git reset --merge 

E davvero old-school:

git reset --hard 

Ma in realtà, vale la pena notare che git merge --abort è equivalente a git reset --merge dato che è presente MERGE_HEAD. Questo può essere letto nella guida di git per il comando di unione.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

Dopo una fusione fallita, quando non c'è MERGE_HEAD, la fusione fallito può essere annullata con git reset --merge, ma non necessariamente con git merge --abort, quindi non sono solo la sintassi vecchio e nuovo per la stessa cosa. Personalmente trovo lo git reset --merge molto più utile nel lavoro di tutti i giorni.