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.
Cristian Escalante
Última actualización: 4 de mayo de 2025
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
- Git pausa el cherry-pick cuando encuentra un conflicto
- Edita los archivos para resolver los conflictos manualmente
- Añade los archivos resueltos al área de preparación con
git add
- 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
Estrategia | Cuándo usarla |
---|---|
Cherry-pick | Para aplicar commits específicos de forma selectiva |
Merge | Para integrar una rama completa preservando el historial |
Rebase | Para 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.