2012-07-30 13 views
58
develop branch 
--> dashboard (working branch) 

Io uso git merge --no-ff develop di unire tutte le modifiche a monte in planciarollback un Git merge

git log:

commit 88113a64a21bf8a51409ee2a1321442fd08db705 
Merge: 981bc20 888a557 
Author: XXXX <> 
Date: Mon Jul 30 08:16:46 2012 -0500 

    Merge branch 'develop' into dashboard 

commit 888a5572428a372f15a52106b8d74ff910493f01 
Author: root <[email protected]> 
Date: Sun Jul 29 10:49:21 2012 -0500 

    fixed end date edit display to have leading 0 

commit 167ad941726c876349bfa445873bdcd475eb8cd8 
Author: XXXX <> 
Date: Sun Jul 29 09:13:24 2012 -0500 

La fusione aveva circa 50+ impegna in esso, e mi chiedo come basta ripristinare la fusione in modo da cruscotto torna allo stato pre-merge

la seconda parte di questo è, se non faccio fondersi con --no-ff, non ho ricevuto il commit 'Il ramo di unione 'sviluppa' nel dashboard '.. Come riavvolgere tale unione?

+2

Possibile duplicato di [Undo a Git merge?] (Http://stackoverflow.com/q/2389361/456814). –

risposta

118

Ripristino un'unione commit è stata esaurientemente coperti di other questions. Quando si esegue una stampa unione fast-forward, il secondo che lei descrive, è possibile utilizzare git reset per tornare allo stato precedente:

git reset --hard <commit_before_merge> 

Puoi trovare il <commit_before_merge> con git reflog, git log, o, se ti senti il ​​Moxy (e non hanno fatto altro): git reset --hard [email protected]{1}

+4

grazie per la rapida risposta .. guardando git log, il commit prima dell'unione è di 50+ commit, dato che lo sviluppo di git merge mette in realtà tutti gli altri commit. Immagino che cosa non otterrò, se non sapessi cosa/dove è stata questa unione - come lo trovo? Mi riferisci a trovare il commit_before_merge .. Immagino che non capisco che la parte – cgmckeever

+2

sembra come con git reflog che assomiglia molto alle ultime teste, e mi permette di sapere dove devo resettare. log git sembra avere troppa granularità per individuare il luogo in cui ripristinare.Grazie – cgmckeever

+0

Sì, 'reflog' è un vero toccasana. 'HEAD @ {1}' descrive solo il secondo stato più recente di HEAD, o più tecnicamente: "Un riferimento seguito dal suffisso @ con una specifica ordinale inclusa in una coppia di controventi (ad esempio {1}, {15}) specifica il n-esimo valore precedente di tale riferimento. " – Christopher

9

Basta resettare il merge commit con git reset --hard HEAD^.

Se si utilizza --no-ff git crea sempre un'unione, anche se non è stato eseguito alcun commit intermedio. Senza --no-ff git eseguirà semplicemente un avanzamento veloce, il che significa che i rami HEAD saranno impostati su HEAD del ramo unito. Per risolvere questo problema, trovare l'ID commit che si desidera ripristinare e git reset --hard $COMMITID.

+0

Buona soluzione se non si conosce il commit prima dell'unione. – iglesiasedd

2
git reset -m 1 88113a64a21bf8a51409ee2a1321442fd08db705 

Ma può avere unexp effetti collaterali Vedere l'opzione --mainline parent-number in git-scm.com/docs/git-revert

Forse un metodo bruto ma efficace sarebbe quello di controllare il genitore di sinistra di quel commit, fare una copia di tutti i file, ricontrollare HEAD e sostituire tutti i contenuti con i vecchi file. Allora git ti dirà cosa viene stornato e tu crei il tuo commit di ripristino :)!

+1

+1 perché questa risposta non rovina la cronologia come resetta (è molto importante se si è già passati al remoto). Ma quali effetti collaterali inaspettati dovrei aspettarmi? – pedromanoel

+0

È questo l'effetto collaterale che hai menzionato? 'L'annullamento di un commit di unione dichiara che non si desidera che le modifiche dell'albero vengano apportate dall'unione. Di conseguenza, le unioni successive introdurranno solo modifiche dell'albero introdotte da commit che non sono antenati della fusione precedentemente ripristinata. Questo potrebbe essere o non essere quello che vuoi. – pedromanoel

22

Da qui:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash> 

Git revert aggiunge un nuovo commit che ripristina il commit specificato.

Utilizzando -m 1 indica che si tratta di un'unione e che si desidera eseguire il rollback al commit parent sul ramo principale. Dovresti usare -m 2 per specificare il ramo di sviluppo.

+6

Nota che non puoi ri-unire il ramo dopo questo, come dice il documento: "Il ripristino di un merge commit dichiara che non vorrai mai le modifiche dell'albero introdotte dall'unione. un risultato, le unioni successive porteranno solo le modifiche dell'albero introdotte dai commit che non sono antenati della fusione precedentemente ripristinata, che potrebbe essere o non essere quello che vuoi. " –

+1

@ DaliborKarlović Questa affermazione è un po 'dura. Puoi sicuramente riportare quelle modifiche in seguito, il trucco è di ripristinare il commit di ripristino. Maggiori informazioni [qui] (https://git-scm.com/blog/2010/03/02/undoing-merges.html) nella sezione "Ripristinare il ripristino" – Hilikus