2011-09-29 3 views
10

ho tre rami A, B e C. B è regolarmente fusa in C.git - merge differenza di rami

  o---o---o A 
     /
--------o---o---o---o---o---o B 
     \  \  \ \ 
      o---o---o---o---o---o C 

Ora voglio unire le modifiche che ho fatto in C, ma senza le unioni da B, in cima a A. Qual è il modo più semplice per farlo in git?

+1

Per quale ramo vorresti unirlo? –

+1

lo vuole in cima ad una – CharlesB

+1

Would not che portano ad una situazione in cui si dispone impegna Q, W (ramo C), E, ​​R (ramo B) - merge - T, Y (ramo C) e appena selezionando Q, W, T, Y dal ramo C si romperanno le cose a causa del codice mancante da E, R (che probabilmente T, Y base su)? –

risposta

8

Utilizzare la rebase git.

In primo luogo, la vostra rebase C sulla parte superiore di B:

git checkout C 
git checkout -b rebasedC#Let's do a new branch for it also, just in case 
git rebase B 

sarà posto tutto C si impegna a di B. Ora vogliamo ramo trapianto rebasedC da B ad A:

git rebase --onto A B rebasedC 

Quindi, ora i tuoi C-commit sono in cima a A nel ramo rebasedC. Ora puoi far avanzare rapidamente il tuo A:

git checkout A 
git merge rebasedC 
git branch -d rebasedC# I don't think you would need it. 

Questo è tutto, spero.

+1

come si fa a sbarazzarsi delle fusioni di B fatte in C? – CharlesB

+3

Rebase lo fa. Quindi spostate i commit sopra a B, ovviamente la C non ha più bisogno delle unioni, quindi vengono rilasciati. – kan

+2

L'ho provato con il mio git, ora ho la struttura ad albero: http://files.rsdn.ru/20380/git.png (il ramo A qui è chiamato 'master'). – kan

1

È possibile provare le patch non-unione cherry-picking di C. Preparati a gestire i conflitti di fusione. :)