09/11/2009
En el vasto universo de Git, existen comandos que usamos a diario y otros que permanecen ocultos, como herramientas de precisión guardadas para una ocasión especial. Uno de estos comandos es git cherry-pick. Su nombre, que se traduce como "seleccionar cerezas", es curiosamente descriptivo: nos permite elegir los mejores commits (las cerezas más dulces) de una rama para aplicarlos en otra. Aunque suene técnico y algo intimidante, entender su funcionamiento puede resolver escenarios complejos que un simple merge o rebase no podrían solucionar de manera limpia. Este artículo es una inmersión profunda en el qué, por qué y cómo del cherry-picking, para que puedas añadir esta potente habilidad a tu arsenal de desarrollador.

¿Qué es Exactamente Git Cherry-Pick?
En esencia, git cherry-pick es un comando que toma los cambios introducidos en un commit existente y los aplica como un nuevo commit en la rama en la que te encuentras actualmente. A diferencia de un merge, que trae todos los commits de una rama a otra, el cherry-pick es selectivo. Imagina que tienes una rama de desarrollo con diez nuevos commits, pero solo uno de ellos contiene una corrección de un bug crítico que también necesitas aplicar en tu rama principal (master o main) de inmediato. En lugar de fusionar toda la rama de desarrollo, con sus características a medio terminar, puedes "cosechar" únicamente ese commit específico y plantarlo en tu rama principal. El resultado es un nuevo commit en la rama principal que contiene exactamente los mismos cambios que el commit original, aunque con un nuevo identificador (hash).
¿Por Qué y Cuándo Deberías "Cosechar" un Commit?
La necesidad de usar cherry-pick surge en situaciones muy específicas donde la fusión de ramas completas no es deseable o posible. Veamos algunos escenarios prácticos:
- Corrección de Bugs Urgentes (Hotfixes): Este es el caso de uso más común. Un desarrollador corrige un bug en una rama de desarrollo (
develop), pero ese mismo bug afecta a la versión en producción (main). Concherry-pick, puedes aplicar solo el commit de la corrección amainsin arrastrar otras funcionalidades inestables. - Backporting: Imagina que necesitas aplicar una nueva funcionalidad o una corrección de seguridad no solo a la versión más reciente de tu software, sino también a versiones anteriores que aún reciben mantenimiento. Estas versiones antiguas viven en sus propias ramas. El cherry-picking te permite portar esos commits específicos hacia atrás, a las ramas de mantenimiento.
- Recuperar Commits Perdidos: A veces, una rama de funcionalidad se elimina por error antes de ser fusionada. Si aún tienes acceso al commit hash, puedes usar
cherry-pickpara recuperar esos cambios y aplicarlos a una nueva rama. - Colaboración Selectiva: En un proyecto grande, un desarrollador en otro equipo podría hacer un commit útil en su propia rama de funcionalidades. Si necesitas ese cambio específico para tu trabajo pero no toda su rama, el cherry-pick es la solución perfecta.
Un ejemplo real podría ser el mantenimiento de la documentación de un proyecto. Supongamos que se añade un banner de advertencia en la versión más reciente de la documentación (en la rama main). Sin embargo, este mismo banner es necesario en todas las versiones archivadas anteriores, cada una en su propia rama (v1.0, v1.1, etc.). Replicar el cambio manualmente en cada rama sería tedioso y propenso a errores. La solución elegante es hacer cherry-pick del commit que introdujo el banner desde main a cada una de las ramas de archivo.
Guía Práctica: Cómo Hacer un Cherry-Pick Paso a Paso
Ahora que entendemos la teoría, vamos a la práctica. El proceso es metódico y requiere atención al detalle para evitar problemas.
Paso 1: Sincroniza tu Repositorio Local
Antes de cualquier operación, es crucial que tu repositorio local esté actualizado con la información del repositorio remoto. Esto es especialmente importante porque el commit que quieres "cosechar" podría estar en una rama que no tienes localmente o que está desactualizada. Un error común es obtener un fatal: bad object, que significa que Git no puede encontrar el commit que le pides porque no tiene conocimiento de él.

Ejecuta los siguientes comandos:
# Descarga toda la información nueva del repositorio remoto (nuevas ramas, commits, etc.) git fetch --all # Opcionalmente, si estás en la rama principal, asegúrate de que esté al día git checkout main git pull origin mainPaso 2: Encuentra el Commit que Quieres "Cosechar"
Necesitas el identificador único del commit, conocido como el hash del commit. Puedes encontrarlo usando el comando git log en la rama que contiene el commit deseado.
# Ve a la rama donde se encuentra el commit original git checkout nombre-de-la-rama-origen # Muestra el historial de commits git logVerás una lista de commits. Cada uno tiene un hash largo (ej: e895a107edba5e68cc0e36fa3a05a687e806cc19). Copia el hash del commit que te interesa. Normalmente, con los primeros 7-10 caracteres es suficiente.
Paso 3: Sitúate en la Rama de Destino
Ahora, debes moverte a la rama de destino, es decir, la rama donde quieres aplicar los cambios del commit.
# Cambia a la rama donde aplicarás el commit git checkout nombre-de-la-rama-destinoPaso 4: ¡A Cosechar! Ejecuta el Comando Cherry-Pick
Con el hash del commit copiado y ubicado en la rama correcta, ejecuta el comando git cherry-pick.

# Aplica el commit en la rama actual git cherry-pick e895a107edba5e68cc0e36fa3a05a687e806cc19Si todo va bien, Git creará un nuevo commit en tu rama con los cambios del commit seleccionado. ¡Felicidades, has realizado un cherry-pick exitoso!
Paso 5: Manejando Conflictos: Las "Cerezas Amargas"
No siempre el proceso es tan fluido. A veces, los cambios del commit que estás aplicando entran en conflictos con el estado actual de tu rama de destino. Esto ocurre si el mismo fragmento de código ha sido modificado de forma diferente en ambas líneas de tiempo. Cuando esto sucede, Git detiene el proceso de cherry-pick y te pide que resuelvas los conflictos manualmente.
- Identifica los conflictos: Ejecuta
git statuspara ver qué archivos están en conflicto. - Resuelve los conflictos: Abre los archivos marcados en tu editor de código. Verás marcadores como
<<<<<<< HEAD,=======, y>>>>>>>que delimitan las versiones conflictivas. Edita el archivo para dejar la versión final que deseas conservar, eliminando los marcadores de Git. - Marca como resuelto: Una vez que hayas resuelto los conflictos en un archivo, debes informárselo a Git usando
git add. - Continúa el proceso: Después de añadir todos los archivos resueltos, puedes decirle a Git que continúe con el cherry-pick.
git add nombre-del-archivo-resueltogit cherry-pick --continueSi en medio del proceso te arrepientes o te sientes perdido, siempre puedes abortar la operación y volver al estado anterior al cherry-pick:
git cherry-pick --abortPaso 6: Finaliza y Sube tus Cambios
Una vez que el cherry-pick se ha completado (con o sin resolución de conflictos), tendrás un nuevo commit en tu rama local. El último paso es subirlo al repositorio remoto.
git push origin nombre-de-la-rama-destinoCherry-Pick vs. Merge vs. Rebase: ¿Cuál Usar?
Es fácil confundir estos tres comandos, pero cada uno tiene un propósito distinto. Aquí tienes una tabla para aclarar sus diferencias:
| Comando | Propósito Principal | Caso de Uso Típico | Impacto en el Historial |
|---|---|---|---|
| git cherry-pick | Copiar un commit específico de una rama a otra. | Aplicar un hotfix, backporting de características. | Crea un nuevo commit duplicando los cambios. Puede generar commits duplicados si las ramas se fusionan más tarde. |
| git merge | Integrar todos los cambios de una rama en otra. | Fusionar una rama de funcionalidad completada en la rama principal. | Crea un "commit de fusión" que une las dos historias. Preserva el historial exacto de cada rama. |
| git rebase | Mover o combinar una secuencia de commits a una nueva base. | Actualizar una rama de funcionalidad con los últimos cambios de la rama principal para mantener un historial lineal. | Reescribe el historial. Los commits se vuelven a aplicar uno por uno, creando nuevos commits y un historial más limpio y lineal. |
Preguntas Frecuentes (FAQ) sobre Git Cherry-Pick
¿Qué es `git cherry-pick` en resumen?
Es un comando para aplicar los cambios de un commit existente de cualquier rama en la rama actual, creando un nuevo commit.
¿Cuándo debería usar `cherry-pick` en lugar de `merge`?
Usa `cherry-pick` cuando necesites solo uno o unos pocos commits de una rama, pero no la rama entera. Es ideal para situaciones aisladas como hotfixes o portar una pequeña funcionalidad, mientras que `merge` se usa para integrar una característica completa.

¿Qué hago si hay un conflicto durante un `cherry-pick`?
Debes editar manualmente los archivos en conflicto para resolver las diferencias, luego usar git add para marcarlos como resueltos y finalmente ejecutar git cherry-pick --continue para finalizar el proceso.
¿`cherry-pick` modifica el commit original?
No. El commit original en su rama de origen permanece intacto. `cherry-pick` lee sus cambios y crea un commit completamente nuevo (con un nuevo hash) en la rama de destino.
¿Puedo hacer `cherry-pick` de varios commits a la vez?
Sí. Puedes pasar múltiples hashes de commit al comando: git cherry-pick <hash1> <hash2>. También puedes seleccionar un rango de commits: git cherry-pick <hash_inicio>^..<hash_fin> (esto aplicará desde el commit posterior a `hash_inicio` hasta `hash_fin`, inclusivo).
Conclusión
git cherry-pick es una herramienta de precisión. Aunque no es algo que usarás todos los días, en las circunstancias adecuadas, es increíblemente poderosa y la solución más limpia. Permite una gestión de código granular que otros flujos de trabajo no ofrecen. Como con cualquier herramienta potente, es vital entender cuándo y cómo usarla correctamente para evitar complicaciones, como historiales confusos o commits duplicados. Ahora que conoces su funcionamiento, estás mejor preparado para enfrentar esos escenarios complejos y mantener tus repositorios ordenados y eficientes.
Si quieres conocer otros artículos parecidos a Git Cherry-Pick: El Arte de Elegir Commits puedes visitar la categoría Juegos.
