El siguiente es un escenario que comúnmente enfrento:
Tienes un conjunto de confirmaciones en master
o design
, que quiero poner encima de production
rama.
Tiendo a crear una nueva rama con la base como production
Elija estos compromisos y cámbielo para production
Entonces cuando me fusiono master
En producción, me enfrento a conflictos de fusión porque incluso aunque los cambios son los mismos, pero se registran como un compromiso diferente debido a la selección de cereza.
He encontrado algunas soluciones para lidiar con esto, todas las cuales son laboriosas y pueden denominarse "hacks".
Aunque "no he hecho demasiada rebasación, creo que eso también crea un nuevo hash de confirmación".
¿Debo estar utilizando rebasing donde estoy cherrypicking. ¿Qué otras ventajas tiene eso sobre esto?
Respuestas
3 para la respuesta № 1Deberías hacer un rebase --interactive
Su rama de diseño sobre producción, donde:
- Puede reordenar sus compromisos, comenzando con los que necesita en producción.
- luego puede fusionar la producción al último compromiso de diseño que desee incorporar (avance rápido)
-x - x - x1 - x - x2 (diseño) p - p (producción)
Con x1 y x2 que necesitan ser incluidos en la producción:
git checkout design
git rebase --interactive production
-x
p--p (production)
x1"-x2"--x"--x" (design)
Entonces:
git checkout production
git merge x2"
-x
p--p--x1"--x2" (production)
x"--x" (design)
Eso te permite:
- para validar los compromisos de diseño actuales contra los compromisos de producción (durante la rebase)
- reordenar los compromisos de diseño
- Incluir los primeros en producción.
- permite que las subsiguientes combinaciones de diseño a producción sean rápidas.
Lakshman Prasad añade:
Presiono los cambios al final del día la mayor parte del tiempo. Así que realmente no ayuda mucho. ¿Cómo cambiaría su respuesta para la rama maestra empujada?
Haría lo mismo, pero con una sucursal privada creada solo para la operación:
git checkout master
git checkout -b master-private
-x - x - x1 - x - x2 (maestro, maestro-privado) p - p (producción)
, luego el rebase, esta vez con la sucursal privada (es decir, una sucursal que nunca se presionará).
git rebase --interactive production
-x--x--x1--x--x2 (master)
p--p (production)
x1"-x2"--x"--x" (master-private)
Entonces:
git checkout production
git merge x2"
-x--x--x1--x--x2 (master)
p--p--x1"--x2" (production)
x"--x" (master-private)
master
no se beneficiará de la reordenación de compromiso (con un orden más lógico), pero al menos puede empujar master
cuando quieras.
Y production
Todavía puede incluir exactamente lo que necesita.
Si posteriormente se compromete a master
tienen el mismo problema (algunos deben ser incluidos para production
, otra voluntad mas adelante), yo lo haría:
- borrar
master-private
(No nos importan esos x, copia de x confirmaciones del maestro) - hacer una
master-private
rama encima de maestro - volver a hacer el
rebase --interactive
, con una táctica cruda de resolución de conflictos (a excepción de los primeros compromisos de esemaster-private
sucursal, ya que éstas deben integrarse en elproduction
rama)
-x - x - x1 - x - x2 - x - x3 - x (maestro) p - p - x1 "- x2" - x3 "(producción) | | x "" - x "" (maestro-privado) x ".. x" (antiguo x "del primer maestro-privado)