2011-09-29 20 views
10

tengo tres ramas A, B y C. B se fusionó con regularidad en C.GIT - fusionar diferencia de las ramas

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

Ahora que fusionar los cambios que hice en C, pero sin las fusiones desde B, además de A. ¿Cuál es la forma más fácil de hacer esto en git?

+1

Para qué rama le gustaría que fusionarlo? –

+1

lo quiere encima de A – CharlesB

+1

¿No te llevaría eso a una situación en la que has confirmado Q, W (rama C), E, ​​R (rama B) - fusiona - T, Y (rama C) y solo seleccionando Q, W, T, Y desde la rama C se romperán las cosas debido a la falta de un código de E, R (¿cuál es probablemente la base T, Y)? –

Respuesta

8

Usa la base de datos de git.

En primer lugar, el rebase C en la parte superior de B:

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

se colocará todos los C se compromete a de B. Ahora queremos rama trasplante rebasedC de B a A:

git rebase --onto A B rebasedC 

Entonces, ahora tiene sus C-commits encima de A en la rama rebasedC. Ahora puede adelantar su A a ella:

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

Eso es todo, espero.

+1

¿Cómo se elimina esto de las fusiones B hechas en C? – CharlesB

+3

Rebase lo hace. Luego, mueves confirmaciones encima de B, obviamente, la C ya no necesita las fusiones, por lo que se descartan. – kan

+2

Lo he intentado con mi git, ahora tengo la estructura de árbol: http://files.rsdn.ru/20380/git.png (en su lugar, la rama A se llama 'maestra'). – kan

1

Puede probar cherry-picking C parches sin fusión. Esté preparado para manejar conflictos de fusión. :)