2009-09-17 12 views
34

Entonces, tengo una rama de mantenimiento y una rama principal en mi proyecto. Si hago una confirmación en la rama de mantenimiento y quiero fusionarlo con interés la rama principal, eso es fácil:¿Cómo respaldo una confirmación en git?

git checkout master; git merge maintenance 

Pero si quiero ir al revés, es decir, aplicar una confirmación hecha a dominar de nuevo a mi rama de mantenimiento, ¿cómo hago eso? ¿Esto es considerado como una selección de cerezas? ¿Causará problemas o conflictos si fusiono de nuevo la rama de mantenimiento?

Respuesta

30

Este es exactamente el caso de uso para git-cherry-pick

git checkout maintenance 
git cherry-pick <commit from master> 
+0

Enlace roto. ¿Tienes la nueva referencia? Gracias – glarrain

+1

Recuperé con éxito ese enlace el 16 de junio de 2012. – mwalling

+0

Genial, ha vuelto. Tal vez fue solo temporal. Gracias @mwalling – glarrain

0

Sí, se considera cherry picking y no, por lo general No debe introducir problemas. Si la confirmación no se aplica limpiamente cuando se hace una copia de respaldo, es posible que enfrente exactamente el mismo conflicto cuando se recupere.

0

Como regla general, yo uso fusionarse para mover los cambios "arriba" del árbol (de mantenimiento de dominar) y reajustar para moverlos hacia "abajo" el árbol (del maestro al mantenimiento). Esto es así para mantener el orden de confirmaciones en la rama maestra.

Rebase rueda posterior esencialmente todos los cambios en la rama actual al tenedor (o último), rebase copias más de los cambios más recientes y luego vuelve a aplicar los cambios.

Si no desea conseguir todos cambios desde el maestro, entonces es probable que necesite para recoger las cerezas las que desee.

+2

Me pregunté sobre * rebase * también.Pero presumir que existe una rama _maintenance_ específica para _no_ tener todos los cambios actuales, entonces eso no es lo que desea. Me parece mejor volver a establecer una base de desarrollo, pero seleccionar una corrección de errores en el maestro (o en cualquier rama de desarrollo ascendente) de vuelta al mantenimiento. –

11

Solución alternativa a la utilización de "git cherry-pick" (como se recomienda en otras respuestas) sería crear un [tema] separada de rama para el arreglo fuera de la rama de mantenimiento, y combinar esta rama en primer lugar en la rama de mantenimiento, luego en rama principal (tronco).

Este flujo de trabajo es (un poco) descrito en Resolving conflicts/dependencies between topic branches early entrada en el blog por Junio ​​C Hamano, mantenedor git.

Resultados de recolección de cerezas en confirmación duplicada, lo que puede ocasionar problemas al fusionar o volver a basar. El flujo de trabajo basado en ramas temáticas solo conserva una copia de la corrección.

+0

Me gusta cómo la publicación vinculada explica la adición de varias confirmaciones que pueden entrar en conflicto. Combine la característica A con el arreglo B de errores juntos, antes de fusionar cualquiera de ellos en la rama Maestra o Mantenimiento. De esta forma, puedes asegurarte de que los conflictos entre A y B se resuelven, de modo que si primero sacas A o B, entonces puedes obtener fácilmente la fusión de A + B después y saber que está precombinado para ti. Ver [diagrama 3 en el documento vinculado] (http://gitster.livejournal.com/27297.html). –

0

Como ya se ha mencionado, la recolección de cerezas es probablemente la mejor opción. Solo quería agregar que los conflictos durante el "cherry picking" a menudo se pueden resolver examinando las "dependencias" de la confirmación que está seleccionando, y que he creado el a tool called git-deps para detectar y visualizar esas dependencias. Si visitas la página de inicio, verás dos videos de YouTube: el primero da una introducción general a la herramienta, y el segundo demuestra cómo se puede usar para evitar conflictos cuando seleccionas.

Cuestiones relacionadas