2012-07-19 13 views
7

Ho unito il ramo beta al ramo principale. Ho spinto verso l'origine. Ora voglio che il master sia come prima della fusione sia localmente che da remoto.Quale hash di commit per annullare un'unione spinta utilizzando git-revert?

Una buona risposta per undoing a merge that was already pushed suggerisce

git revert -m 1 commit_hash 

Se questa è davvero la strada da percorrere, come posso determinare commit_hash? Ho provato, senza successo, l'hash restituito da merge-base:

$ git merge-base --all master beta 
1f4b949b7ef97abf913ae672e3acd0907abfac1b 
$ git revert -m 1 1f4b949b7ef97abf913ae672e3acd0907abfac1b 
error: Mainline was specified but commit 1f4b949b7ef97abf913ae672e3acd0907abfac1b is not a merge. 
fatal: revert failed 

Ho esaminato entrambe le interpretazioni git-log e gitk dei rami, ma sono molto lunghi, e sono incerto abbastanza della mia interpretazione di sentirsi dovrei cercare assistenza prima di fare un pasticcio forse più grande. Beta è stato derivato dalla v2 che è stata derivata dal master. Ci sono state alcune fusioni da master in v2 e beta lungo la strada, dal momento che ho mantenuto le nuove filiali aggiornate con il master. La fusione nella direzione da beta a master è stato un errore che vorrei correggere.

Una volta che faccio determinare il punto di fusione, se trovo qualche commit fatti sul master dopo la fusione che in realtà dovrebbe essere sul ramo beta, qual è il modo migliore per spostarli sopra?

+2

Prova 'log --all --graph --pretty = tFormattare: '% Cred% h% Creset -% C (giallo)% d% Creset% s% Cgreen (% un cr%)% Creset' - abbrev-commit --date = relative' (lo nomino personalmente), mostrerà i commit di tutti i rami e la loro data, e anche dove avvengono le fusioni. –

risposta

4

Hai bisogno di trovare il commit del merge, git merge-base dice la impegnano in cui è possibile fare l'unione. Fondamentalmente è l'ultimo commit esistente in quei due rami. Il commit di unione esiste solo nel tuo ramo principale, a meno che tu non abbia creato un nuovo ramo dopo l'unione, ma qui non è rilevante. :)

Per trovare l'unione commettere prova: git log master ^beta --ancestry-path --merges

Il necessario commettere è l'ultima commit.

Ma vi prego di leggere su Linus' write up: http://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt

1

un'occhiata anche a http://sethrobertson.github.com/GitFixUm/ che ti guida attraverso quasi tutti i problemi git, tra cui si fonde spinto. Tuttavia ... le fusioni forzate non hanno una soluzione facile.

Problemi correlati