HDP115

Cherry Pick

Aprende a utilizar git cherry-pick para aplicar commits específicos de una rama a otra, permitiéndote seleccionar cambios concretos sin necesidad de fusionar ramas completas.

CE

Cristian Escalante

Última actualización: 4 de mayo de 2025

git
control de versiones
desarrollo

Cherry Pick

A veces necesitas aplicar cambios específicos de una rama a otra, sin fusionar la rama completa. Git ofrece una solución elegante para esto: el comando cherry-pick. Como su nombre sugiere, te permite "recoger" commits individuales y aplicarlos selectivamente donde los necesites. En esta lección, aprenderás cómo utilizar cherry-pick de manera efectiva y cuándo es apropiado hacerlo.

¿Qué es cherry-pick?

Cherry-pick es un comando que permite copiar un commit específico de una rama y aplicarlo en otra rama. A diferencia de merge o rebase, que integran una secuencia completa de commits, cherry-pick te permite seleccionar exactamente qué cambios quieres incluir.

Cuando haces cherry-pick de un commit, Git crea un nuevo commit en la rama de destino con los mismos cambios pero con un hash diferente.

Sintaxis básica

git cherry-pick <commit-hash>

Donde <commit-hash> es el identificador del commit que deseas aplicar.

Casos de uso comunes

1. Backporting de correcciones

Uno de los usos más frecuentes es aplicar correcciones de errores de la rama de desarrollo a la rama de producción:

# Situación: tienes una corrección en la rama develop que necesitas en main
git checkout main
git cherry-pick abc1234  # Hash del commit con la corrección

2. Recuperar cambios de una rama descartada

Si has experimentado en una rama que no vas a fusionar, pero contiene algunos cambios útiles:

# Identificar el commit útil en la rama experimental
git log feature/experimental

# Aplicar ese commit específico a tu rama principal
git checkout main
git cherry-pick def5678

3. Aplicar cambios no consecutivos

Cuando necesitas varios commits específicos pero no todos los que hay entre ellos:

git checkout rama-destino
git cherry-pick abc1234  # Primer commit
git cherry-pick ghi9101  # Segundo commit (no consecutivo)

4. Reorganizar commits

Puedes usar cherry-pick para reorganizar commits en una nueva rama:

git checkout -b rama-reorganizada
git cherry-pick <commit1> <commit2> <commit3>  # En el orden deseado

Opciones avanzadas

Cherry-pick múltiples commits

Puedes aplicar varios commits en una sola operación:

git cherry-pick <commit1> <commit2> <commit3>

O un rango de commits:

git cherry-pick <commit-inicio>..<commit-fin>

Mantener el autor original

Por defecto, cherry-pick mantiene el autor original pero te pone como committer. Si quieres mantener ambos:

git cherry-pick -x <commit-hash>

Esto añade una línea "cherry picked from commit..." al mensaje del commit.

Cherry-pick sin crear un commit

Si quieres aplicar los cambios pero no crear un commit automáticamente:

git cherry-pick -n <commit-hash>

Esto es útil cuando quieres combinar cambios de varios commits antes de confirmarlos.

Continuar, abortar o saltar

Si hay conflictos durante el cherry-pick:

# Después de resolver los conflictos
git cherry-pick --continue

# O para abortar el proceso
git cherry-pick --abort

# O para saltar el commit problemático
git cherry-pick --skip

Manejo de conflictos

Al igual que con merge o rebase, pueden surgir conflictos durante un cherry-pick si los cambios se solapan con modificaciones existentes.

Proceso de resolución de conflictos

  1. Git pausa el cherry-pick cuando encuentra un conflicto
  2. Edita los archivos para resolver los conflictos manualmente
  3. Añade los archivos resueltos al área de preparación con git add
  4. Continúa el proceso con git cherry-pick --continue
git cherry-pick abc1234
# Conflicto en archivo.txt
# Edita archivo.txt para resolver el conflicto
git add archivo.txt
git cherry-pick --continue

Mejores prácticas

1. Verifica antes de cherry-pick

Antes de aplicar un commit, examina su contenido para asegurarte de que contiene exactamente lo que necesitas:

git show <commit-hash>

2. Considera las dependencias

Los commits a menudo dependen de cambios anteriores. Asegúrate de incluir todos los commits necesarios para que el código funcione correctamente.

3. Prueba después del cherry-pick

Siempre verifica que tu código sigue funcionando después de aplicar los cambios.

4. Documenta el origen

Usa la opción -x o añade un comentario en el mensaje de commit para indicar de dónde proviene el cambio:

git cherry-pick -x <commit-hash>

5. Prefiere merge o rebase cuando sea apropiado

Cherry-pick es ideal para casos específicos, pero para integrar ramas completas, merge o rebase suelen ser más adecuados.

Comparación con otras estrategias

EstrategiaCuándo usarla
Cherry-pickPara aplicar commits específicos de forma selectiva
MergePara integrar una rama completa preservando el historial
RebasePara integrar una rama completa con un historial lineal

Escenarios prácticos

Escenario 1: Backporting de una corrección de seguridad

# Identificar el commit con la corrección en la rama de desarrollo
git log --grep="security fix" develop

# Aplicar la corrección a la versión en producción
git checkout release/v1.0
git cherry-pick abc1234

# Probar y desplegar

Escenario 2: Recuperar trabajo de una rama experimental

# Revisar los commits en la rama experimental
git log feature/experimental

# Crear una nueva rama para el trabajo recuperado
git checkout -b feature/recuperada main

# Aplicar selectivamente los commits útiles
git cherry-pick def5678 ghi9101

# Continuar el desarrollo desde ahí

Escenario 3: Aplicar un hotfix a múltiples versiones

# Crear el hotfix en la rama principal
git checkout main
# Hacer cambios y commit
git commit -m "Fix critical bug #123"

# Aplicar el mismo fix a versiones anteriores
git checkout release/v2.0
git cherry-pick main
git checkout release/v1.5
git cherry-pick main

Posibles problemas y soluciones

Cambios ya presentes

Problema: El cherry-pick falla porque los cambios ya están en la rama de destino.

Solución: Usa la opción --skip para ignorar ese commit.

git cherry-pick --skip

Conflictos complejos

Problema: Los conflictos son demasiado complejos para resolverse fácilmente.

Solución: Aborta el cherry-pick y considera otras estrategias.

git cherry-pick --abort

Dependencias faltantes

Problema: El commit cherry-picked depende de otros cambios que no están en la rama de destino.

Solución: Identifica y aplica primero los commits de los que depende.

git cherry-pick <commit-dependencia>
git cherry-pick <commit-principal>

Herramientas visuales

Muchas interfaces gráficas para Git facilitan el proceso de cherry-pick:

  • GitKraken: Permite cherry-pick con un simple clic derecho en el commit
  • Sourcetree: Ofrece una opción de cherry-pick en el menú contextual
  • Visual Studio Code: Con extensiones como GitLens
  • GitHub Desktop: Simplifica la visualización de commits para cherry-pick

Conclusión

Cherry-pick es una herramienta poderosa que te permite aplicar cambios específicos de forma selectiva entre ramas. Es especialmente útil para backporting de correcciones, recuperación de trabajo de ramas experimentales y aplicación de cambios no consecutivos.

Sin embargo, como cualquier herramienta que modifica el historial, debe usarse con criterio. Recuerda que cherry-pick crea nuevos commits con nuevos hashes, lo que puede dificultar el seguimiento del origen de los cambios si no se documenta adecuadamente.

Cuando se usa correctamente, cherry-pick complementa perfectamente otras estrategias de ramificación e integración, dándote un control fino sobre qué cambios aplicar y dónde aplicarlos.

Rebase
Aprende a utilizar git rebase para mantener un historial de ...
Referencias
Git. Git - git-cherry-pick Documentation. https://git-scm.com/docs/git-cherry-pick
Scott Chacon and Ben Straub. Pro Git Book - Git Tools - Rewriting History. https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History
Atlassian Git Tutorial. Cherry-picking explained. https://www.atlassian.com/git/tutorials/cherry-pick

Conceptos Básicos de HTML

Aprende los conceptos básicos de HTML

Conceptos Básicos de CSS

Aprende los conceptos básicos de CSS

Conceptos Básicos de JavaScript

Aprende los conceptos básicos de JavaScript

Conceptos Básicos SQL

Aprende los conceptos básicos de SQL

Conceptos Básicos de Python

Aprende los conceptos básicos de Python

Conceptos Básicos de UML

Aprende los conceptos básicos de UML

Refuerzo Academico de Herramientas de Productividad 2025