2010-09-14 12 views
30

Estoy seguro de que esto es algo simple que se ha preguntado y respondido, pero no sé qué términos buscar. Tengo esto:¿Cómo muevo una confirmación entre sucursales en Git?

/--master--X--Y 
A--B 
    \--C--D--E 

Donde yo comprometí C, D, y E (sólo a nivel local) en una rama, pero luego me di cuenta de que D y E son realmente independientes de C. Quiero mover C a su propio rama, y ​​mantener D y E para más tarde. Es decir, quiero esto:

    /--C 
    /--master--X--Y 
A--B 
    \--D--E 

¿Cómo arranco C desde debajo de D y E?

Respuesta

42

Puede utilizar git cherry-pick para agarrar C, y lo puso en Y. Suponiendo Y existe como la punta de una rama llamada branch-Y:

$ git checkout branch-Y 
$ git cherry-pick C 

Así que ahora C es en la parte superior de Y. Sin embargo, D y E también todavía contiene C (la selección de cereza no mueve una confirmación, solo hace una copia). Vas a tener que reajustar D y E en la parte superior de B. Suponiendo E es la punta de branch-E y B es branch-B, puede:

$ git checkout branch-E 
$ git rebase --interactive branch-B 

Esto abrirá una sesión interactiva de rebase. Simplemente elimina commit C por completo, y deja D y E intactos. A continuación, tendrá D y E actualizados en la parte superior de B sin C.

+4

Tenga en cuenta que 'cherry-pick', a partir de la v1.7.1, puede seleccionar varias confirmaciones, por lo que puede usar esto para" arrastrar "más de lo que uno se compromete También puedes hacer eso creando una rama temporal en E y reajustándola de forma interactiva en Y, manteniendo solo las confirmaciones que deseas, y luego fusionándola (será un avance rápido) en la rama de Y. (Eso siempre funcionó, y podría ser más fácil de todos modos, por lo que no tiene que pegar tantos SHA1). – Cascabel

Cuestiones relacionadas