2011-01-19 23 views
10

Non sono molto esperto con Git e ora ho un grosso problema nelle mie ginocchia.Annullare una git merge

Ecco come il mio ramo corrente assomigliare:

feature  /---F1-----F2----\ 
      /    \ 
master -----M0-----M1-----M2-----M3-----M4 
      \      /
bugfix  \--B1-----B2-----------/ 

La situazione:

qualcuno ha fatto una cosa molto brutta e spinto una pessima merge (M3). Ho notato solo l'unione errata quando i nostri modelli (non il codice sorgente) non venivano caricati dopo aver unito B1 e B2 in M4. Fortunatamente, non ho ancora spinto l'M4.

Il problema:

Come faccio a impostare le cose a posto? Voglio M0, M1, M2, F1, F2, B1 e B2. Ma non voglio M3 e M4 (poiché M4 è ovviamente rotto). Se io devo ad abbandonare le modifiche, quindi F1 e F2 può essere sacrificato :)

ho guardato git revert ma io non sono sicuro che capisco benissimo come funziona. Quindi ... spero davvero in aiuto su come risolvere questo problema.

Grazie in anticipo.

risposta

6

Quindi per chiarire, quello che vuoi è questo, giusto?

feature  /---F1-----F2 
      /    
master -----M0-----M1-----M2 
      \    
bugfix  \--B1-----B2 

Assicurarsi che il HEAD s feature e bugfix sono ancora in F2 e B2 rispettivamente.

Edit: se feature e bugfix sono rami, li rami fare (riporre il vostro lavoro se è UNCOMMITED):

git checkout F2 
git branch feature 
git checkout B2 
git branch bugfix 

Modifica fine

quindi azzerare il master per M2 :

git checkout master 
git reset M2 --hard 

(il ripristino ti farà perdere le tue modifiche locali, se non le vuoi.)

M3 e M4 non vengono distrutte subito, ma alla fine. Non dovrebbero apparire in git log o gitk.

Quindi è il momento di unire feature e creare un valore M3' corretto.

+0

Sì, una specie di, ma "funzionalità", "master" e "bugfix" non sono in realtà diramazioni, sospetto che ciò sia confuso. Cioè, 3 ppl si è impegnato con le proprie modifiche del ramo principale. Un ragazzo ha fatto una brutta fusione e ha spinto. Ho tirato la brutta fusione. Ora voglio un modo per escludere l'unione errata pur mantenendo tutte le singole modifiche ... – aberrant80

+0

Quindi 'feature' e' bugfix' non sono diramazioni? Sicuramente l'autore di 'feature' ha un ramo nel proprio repository. Quello che dovresti fare è resettare il tuo master su M2 e chiedere all'autore di 'feature' di fare lo stesso (ma assicurati che non perda la funzione' del ramo ') e rifare l'unione, correttamente questa volta. Vedi il mio aggiornamento se vuoi farlo tu stesso. – Gauthier

+0

Avete davvero un repository senza un ramo 'master'? – Gauthier

1

Se non è stato eseguito il push (pubblicazione), l'unione si impegna ancora, utilizzare git reset. Per esempio. sul ramo principale, supponendo che l'albero di lavoro sia pulito, fare resettare git --hard.

Maggiori informazioni: Undo a Git merge that hasn't been pushed yet

Se hai pubblichi le modifiche che si potrebbe prendere in considerazione facendo una Ripristina commettere invece. Maggiori informazioni qui: http://progit.org/2010/03/02/undoing-merges.html