/ / Cherrypicking versus Rebasing - git, rebase, git-rebase, cherry-pick

Cherrypicking versus Rebasing - git, rebase, git-rebase, cherry-pick

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 № 1

Deberí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 ese master-private sucursal, ya que éstas deben integrarse en el production 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)