El comando git cherry-pick es una operación de extracción que permite seleccionar un commit arbitrario de cualquier rama y aplicar exactamente esos cambios como un nuevo commit en tu rama actual.
Imagina esta situación: Estás trabajando en una rama experimental (feature/nueva-interfaz) y llevas 20 commits de cambios inestables.
Mientras trabajabas en tu rama, te das cuenta de que has corregido un bug crítico que también afectaba a la rama principal main.
- No puedes hacer Merge: Si fusionas
featureenmain, te llevas también toda la basura inestable, no está lista. - Pero tampoco es cuestión de replicar todos los cambios a mano en
main(con el riesgo de que te dejes algo).
Necesitas una forma de coger solo ese commit específico y aplicarlo en main, ignorando el resto. Para esta operación de precisión existe git cherry-pick.
¿Qué es Cherry-pick?
Como su nombre indica, este comando te permite seleccionar un commit arbitrario de cualquier lugar del repositorio y aplicarlo en tu rama actual.
cherry-pick no mueve el commit. Lo que hace es leer los cambios que introdujo ese commit y crear una copia nueva (con un nuevo Hash) en tu rama actual.
Cómo hacer un Cherry Pick
Vamos a ver el caso de uso más habitual. Tienes un bug en main, y lo has arreglado por casualidad en la rama develop en el commit a1b2c3d.
Quieres llevar ese arreglo a main ya. Los pasos serían lo siguientes:
Identificar el objetivo
Primero necesitas saber el Hash (SHA-1) del commit que quieres copiar.
git log --oneline develop
Supongamos que el commit es: a1b2c3d Corregir error de cálculo en el carrito
Situarse en el destino
Nos movemos a la rama donde queremos pegar el commit.
git switch main
Ejecutar el Cherry-pick
Lanzamos el comando:
git cherry-pick a1b2c3d
Git cogerá los cambios introducidos en a1b2c3d y creará un nuevo commit en main con el mismo mensaje y el mismo autor, pero con el contenido aplicado sobre main.
¡Listo! Bug arreglado en producción sin ensuciar la rama con código experimental.
Conflictos durante el Cherry-pick
Al igual que en un merge o un rebase, al intentar aplicar un parche de una rama en otra, pueden surgir conflictos si el código base es muy diferente.
Si esto ocurre, Git pausará el proceso.
- Resuelve los conflictos en tu editor (VS Code).
- Añade los archivos al Stage:
git add . - Continúa la operación:
git cherry-pick --continue
O, si te arrepientes, puedes cancelar todo con:
git cherry-pick --abort
El tradicional disclaimer
cherry-pick es muy potente, pero no debería ser parte de tu flujo de trabajo diario. Úsalo como una excepción, no como la regla.
El problema es que estás duplicando cambios. Al hacer cherry-pick creas un commit nuevo con un Hash diferente.
Si haces cherry-pick del commit X de develop a main, ahora tienes dos commits idénticos funcionalmente pero distintos para Git (X y X').
Cuando en el futuro hagas un merge de develop a main, Git tendrá que fusionar X con X'. Generalmente Git es listo y se da cuenta de que son iguales (y lo ignora), pero a veces puede generar conflictos.
Si te encuentras haciendo cherry-pick constantemente, es señal de que estás trabajando en la rama equivocada. Quizás deberías haber hecho arreglo en una rama hotfix separada y luego fusionarla tanto en main como en develop.
