2012-03-24 19 views
20

Tengo un montón de compromisos para un proyecto de sistema operativo y quiero sacar solo el último decir 20 commits en otra rama para que pueda obtener la solicitud.Git create branch del rango de commits previos?

¿Cómo podría hacer esto? La razón es que tengo quizás 150 confirmaciones, pero la mayoría de ellas son para una contribución mucho más grande, que aún no está lista. Pero la próxima versión se lanzará pronto.

Gracias!

Respuesta

56

Puede hacerlo con cherry-pick. Si su historial de long_branch se ve así:

A-B <-- master 
    \ 
    C-D-E-F-G-H <-- long_branch 

y desea mover el contenido de, por ejemplo, F a H a una rama diferente, por ejemplo, short_branch, que se basa fuera de master:

git checkout master -b short_branch 

que da

A-B <-- master, short_branch 
    \ 
    C-D-E-F-G-H <-- long_branch 

entonces ... (tenga en cuenta que el cometer rango es E..H; el lado izquierdo es no inclusiva para la gama)

git cherry-pick E..H 

que da:

F'-G'-H' <-- short_branch 
/
A-B <-- master 
    \ 
    C-D-E-F-G-H <-- long_branch 

Tenga en cuenta que me refiero a las nuevas confirmaciones como F', G', H' - esto es porque mientras que contendrán los mismos cambios eficaces como F, G, y H, no serán los mismos commits (debido a diferentes padres + tiempos de compromiso).

5

¿Desea que las 20 confirmaciones permanezcan en la sucursal actual? Si no es así, mantener una referencia a la rama actual de espalda 20 confirmaciones con:

git checkout -b current_branch_save current_branch~20 

A continuación, pasar los últimos 20 confirmaciones con rebase

git checkout current_branch 
git rebase --onto another_branch current_branch~20 current_branch 

ahora tienes current_branch_save con su ~ 100 ' no del todo listo 'commits y current_branch en another_branch con los últimos 20.

+1

Esto realmente me ayudó a deshacerme de los conflictos de fusión. +1 –