Respuestas:
Escoger cerezas en Git significa elegir una confirmación de una rama y aplicarla en otra.
Esto está en contraste con otras formas como merge
y rebase
que normalmente aplican muchas confirmaciones en otra rama.
Asegúrese de estar en la rama a la que desea aplicar el compromiso.
git checkout master
Ejecute lo siguiente:
git cherry-pick <commit-hash>
NÓTESE BIEN:
Si elige una rama pública, debería considerar usar
git cherry-pick -x <commit-hash>
Esto generará un mensaje de confirmación estandarizado. De esta manera, usted (y sus compañeros de trabajo) aún pueden realizar un seguimiento del origen del compromiso y pueden evitar conflictos de fusión en el futuro.
Si tiene notas adjuntas a la confirmación, no siguen la selección de cereza. Para traerlos también, debe usar:
git notes copy <from> <to>
Enlaces adicionales:
git cherry-pick -x <commit-hash>
. Esto generará un mensaje de confirmación estandarizado. De esta manera, usted (y sus compañeros de trabajo) aún pueden realizar un seguimiento del origen del compromiso y pueden evitar conflictos de fusión en el futuro.
git notes copy <from> <to>
para traerlos también.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
La mayoría ppl tiende a pensar en commit como cambios (como svn era iirc), pero no lo es, cada commit se refiere al árbol de trabajo completo. Aunque esto no hace una diferencia en este caso, puede ayudar a entender por qué git funciona como lo hace.
Esta cita está tomada de; Control de versiones con Git (libro realmente genial, te animo a que lo compres si estás interesado en git)
Editar: Dado que esta respuesta todavía está teniendo impresión, me gustaría agregar un video tutorial muy bueno en acción al respecto:
Youtube: Introducción a Git cherry-pick
Uso de git cherry-pick El comando git cherry-pick commit aplica los cambios introducidos por el commit con nombre en la rama actual. Introducirá una nueva confirmación distinta. Hablando estrictamente, el uso de git cherry-pick no altera el historial existente dentro de un repositorio; en cambio, se agrega a la historia. Al igual que con otras operaciones de Git que introducen cambios a través del proceso de aplicación de un diff, es posible que deba resolver conflictos para aplicar completamente los cambios de la confirmación dada . El comando git cherry-pick se usa típicamente para introducir confirmaciones particulares de una rama dentro de un repositorio en una rama diferente. Un uso común es reenviar las confirmaciones de puerto de una rama de mantenimiento a una rama de desarrollo.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
antes de:
después:
La selección de cerezas en Git está diseñada para aplicar algunas confirmaciones de una rama a otra. Se puede hacer si, por ejemplo. cometió un error y cometió un cambio en una rama equivocada, pero no desea fusionar toda la rama. Solo puedes, por ejemplo. revierta el commit y selecciónelo en otra rama.
Para usarlo, solo necesita git cherry-pick hash
saber dónde hash
está un hash de confirmación de otra rama.
Para ver el procedimiento completo, consulte: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Breve ejemplo de situación, cuando necesitas recoger cerezas
Considere el siguiente escenario. Tienes dos ramas
a) release1 : esta rama va a su cliente, pero todavía hay algunos errores que corregir.
b) maestro : rama maestra clásica, donde puede, por ejemplo, agregar funcionalidad para la versión 2.
AHORA : arreglas algo en la versión 1 . Por supuesto, necesita esta solución también en master . Y ese es un caso de uso típico para la recolección de cerezas. Entonces, la selección de cereza en este escenario significa que toma una confirmación de la rama release1 e la incluye en la rama maestra .
cherry-pick es una característica de Git. Si alguien quiere comprometer compromisos específicos en una rama a una rama de destino, se utiliza cherry-pick.
Los pasos de git cherry-pick son los siguientes.
git cherry-pick <commit id>
Aquí commit id es el id de actividad de otra rama.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Preparé ilustraciones paso a paso de lo que hace cherry-pick , y una animación de estas ilustraciones (casi al final).
L
de la rama feature
):
git cherry-pick feature~2
feature~2
es el 2º commit antes feature
, es decir, el commit L
):
Nota:
El commit L'
es desde el punto de vista del usuario (commit = instantánea) la copia exacta del commit L
.
Técnicamente (internamente), es una confirmación nueva y diferente (porque, por ejemplo, L
contiene un puntero a K
(como su padre), mientras que L'
contiene un puntero a E
).
Puede pensar si una selección de cereza es similar a un rebase, o más bien se gestiona como un rebase. Con esto, quiero decir que toma una confirmación existente y la regenera tomando, como punto de partida, el jefe de la rama en la que se encuentra actualmente.
A rebase
toma una confirmación que tenía una X primaria y la regenera como si realmente tuviera una Y primaria, y esto es precisamente lo que cherry-pick
hace.
La selección de cereza es más sobre cómo seleccionar las confirmaciones. Con pull
(rebase), git regenera implícitamente sus confirmaciones locales además de lo que se extrae de su rama, pero con cherry-pick
usted elige explícitamente algunas confirmaciones y las regenera implícitamente encima de su rama actual.
Entonces, la forma en que lo haces es diferente, pero en el fondo son operaciones muy similares: la regeneración de commits.
cherry-pick
comporta de la manera en que lo hace cuando la rama de destino se fusiona nuevamente en la rama de origen. Gracias Señor.
Es algo así como Copiar (desde algún lugar) y Pegar (hacia algún lugar), pero para confirmaciones específicas.
Si desea hacer una reparación, por ejemplo, puede usar la cherry-pick
función.
Haz tu cherry-pick
en una rama de desarrollo, y merge
eso se compromete con una rama de lanzamiento. Del mismo modo, haga una cherry-pick
desde una rama de lanzamiento a master. Voila
Cuando trabajas con un equipo de desarrolladores en un proyecto, administrar los cambios entre varias ramas de git puede convertirse en una tarea compleja. A veces no desea fusionar una rama completa en otra, y solo necesita elegir una o dos confirmaciones específicas. Este proceso se llama 'recolección de cerezas'.
Encontré un gran artículo sobre la recolección de cerezas, échale un vistazo para obtener detalles en profundidad: https://www.previousnext.com.au/blog/intro-cherry-picking-git
Si desea fusionar sin ID de confirmación, puede usar este comando
git cherry-pick master~2 master~0
El comando anterior fusionará las últimas tres confirmaciones del maestro de 1 a 3
Si desea hacer esto para un solo compromiso, simplemente elimine la última opción
git cherry-pick master~2
De esta manera, fusionarás el tercer commit desde el final del master.
Aplicará un compromiso particular a su rama actual.
Esto significa :
Ej: Considerar cometer A
added newFileA
modified main:
+ import './newFileA'
cometer B
added newFileB
modified main:
+ import './newFileB'
Si elige la confirmación B en otra rama, terminará con:
/newFileB
/main :
import './newFileA'
import './newFileB'
ya que commit B contiene newFileB y main , pero no newFileA , lo que resulta en un error, así que úselo con precaución.
Extracto de los documentos oficiales:
Dado uno o más compromisos existentes, aplique el cambio que cada uno introduce, registrando un nuevo compromiso para cada uno. Esto requiere que su árbol de trabajo esté limpio (sin modificaciones de la confirmación HEAD).
Cuando no es obvio cómo aplicar un cambio, sucede lo siguiente:
La rama actual y el puntero HEAD permanecen en la última confirmación realizada con éxito.
La referencia CHERRY_PICK_HEAD está configurada para apuntar a la confirmación que introdujo el cambio que es difícil de aplicar.
Las rutas en las que el cambio aplicado limpiamente se actualizan tanto en el archivo de índice como en su árbol de trabajo.
Para rutas conflictivas, el archivo de índice registra hasta tres versiones, como se describe en la sección "VERDADERO FUSIÓN" de git-merge. Los archivos del árbol de trabajo incluirán una descripción del conflicto entre corchetes por los marcadores de conflicto habituales <<<<<<< y >>>>>>>.
No se realizan otras modificaciones.