Introducción a Git y Cherry-Pick

Git es una herramienta indispensable en el mundo del desarrollo de software, utilizada ampliamente para el control de versiones. Permite a los equipos gestionar cambios en el código fuente de manera eficiente y colaborativa. Todos los que usamos la herramienta Git, conocemos los comandos básicos de commit, pull o push, pero Git esconde algunas funcionalidades que no son tan conocidas y, un buen día, puede salvarnos de un apuro.

Una de esta características no tan populares de Git es cherry-pick, una funcionalidad particularmente poderosa y útil que merece atención especial, especialmente para aquellos nuevos en este sistema.

¿Qué es Git Cherry-Pick?

El comando cherry-pick en Git permite a los desarrolladores seleccionar un cambio específico (commit) de una rama y aplicarlo en otra. Esta herramienta es increíblemente útil cuando quieres incorporar un fix o una mejora específica sin necesidad de mezclar todas las modificaciones de una rama completa. Esto puede ser especialmente útil en situaciones donde las ramas han divergido significativamente, o cuando quieres mantener las ramas lo más limpias y organizadas posible.

A modo de resumen y por simplificar, cherry-pick permite traer un commit de una rama a otra. Nada más y nada menos. Si no lo has usado nunca, te puedes estar preguntando: ¿para qué puedo necesitar esto en mi día a día? Te lo demuestro a continuación.

Cuándo usar Cherry-Pick

Nada mejor que un ejemplo para ilustrar la situación ideal en la que usar cherry-pick. Imagina que estás trabajando en una rama A y, de repente, llega un bug que es urgente corregir. En ese caso, haríamos commits de todos los cambios que tengamos y cambiaríamos a una nueva rama que nace de master o develop. En esa rama, corregiríamos el bug, subiríamos al repositorio remoto y volveríamos a nuestra feature.

Y no hay nada malo en ello, pero, ¿y si los cambios no están listos para ser commiteados? No tiene sentido commitear cambios que no funcionan solo para poder cambiar de rama. Es en este caso cuando entra cherry-pick: haríamos un commit solucionando el bug en nuestra rama (realmente en cualquiera) y lo subimos al repositorio remoto. En ese momento, cualquier compañero de equipo puede crear una nueva rama, coger ese cambio, aplicarlo y subirlo a producción.

También se puede dar la situación de que, trabajando en una feature A, solucionas un bug o añades una funcionalidad que quieres pasar ya a master, sin esperar a que esté toda la funcionalidad lista. Aquí también podrías hacer un cherry-pick desde master del commit y subirlo a producción sin tener que esperar a completar el objetivo de la rama.

Cómo Funciona Cherry-Pick

Para utilizar cherry-pick, es crucial entender cómo localizar el commit específico que quieres transferir a otra rama. Cada commit en Git tiene un identificador único conocido como hash. Con este hash, puedes indicarle a Git exactamente qué commit deseas “recoger”.

Cada cambio en Git se registra como un “commit”, que no solo incluye el contenido del cambio, sino también un identificador único llamado “hash”. Este hash es crucial para muchas operaciones en Git, incluyendo el cherry-pick. Antes de poder realizar un cherry-pick, necesitas identificar el hash del commit que deseas aplicar en otra rama.

Para seleccionar el commit que deseas cherry-pick, puedes utilizar el comando git log. Este comando te muestra una lista de todos los commits en la rama actual, junto con su hash, autor, fecha y mensaje del commit.

git log

Al ejecutar este comando, verás una salida que incluye entradas como esta:

commit 1a2b3c4d5e6f7890g1h2i3j4k5l6m7n8o9p0q (HEAD -> feature, origin/feature)
Author: Tu Nombre <[email protected]m>
Date:   Wed Sep 20 14:00:00 2024

    Arregla el error en la función X

El “hash” del commit en este caso es 1a2b3c4d5e6f7890g1h2i3j4k5l6m7n8o9p0q. Este es el identificador que necesitas para realizar el cherry-pick.

Antes de aplicar el cherry-pick, debes asegurarte de estar en la rama correcta, la cual recibiría el cambio. Si no estás seguro de qué rama estás actualmente, puedes usar git branch para verificarlo. Cambia a la rama destino con:

git checkout nombre-de-la-rama-destino

Una vez en la rama correcta y con el hash del commit, estás listo para aplicar cherry-pick:

git cherry-pick 1a2b3c4d5e6f7890g1h2i3j4k5l6m7n8o9p0q

Si el cherry-pick se completa sin conflictos, el commit se aplicará a tu rama actual y Git te lo confirmará.

Ejemplo Práctico de Cherry-Pick

Supongamos que estás trabajando en una rama llamada feature y has realizado un commit que resuelve un bug específico. Sin embargo, te das cuenta de que este bug también afecta a la rama principal master. Aquí es donde cherry-pick puede ser extremadamente útil.

  1. Identifica el Commit: Primero, necesitas saber el hash del commit. Puedes encontrarlo usando git log . Busca en la lista el commit que necesitas y copia su hash.

  2. Prepara la Rama Destino: Asegúrate de estar en la rama donde quieres aplicar el commit, en este caso, master. git checkout master cambiará a la rama master para que puedas depositar el commit que quieres extraer.

  3. Aplica Cherry-Pick: Ahora puedes aplicar cherry-pick utilizando el hash del commit: git cherry-pick <hash-del-commit>. Si el proceso es exitoso, el cambio se integrará en tu rama main.

Manejo de Conflictos con Cherry-Pick

A veces, al realizar un cherry-pick, puedes encontrarte con conflictos. Esto sucede si los cambios en el commit que estás recogiendo chocan con los cambios en tu rama actual. Git te alertará sobre esto y necesitarás resolver los conflictos manualmente; es decir, necesitarás un paso adicional. Abre los archivos conflictivos, realiza los ajustes necesarios, y luego:

git add <archivo-resuelto>
git cherry-pick --continue

Si decides que no quieres seguir adelante con el cherry-pick, puedes abortar el proceso, ignorándolo:

git cherry-pick --abort

Mejores Prácticas al Usar Cherry-Pick

  • Usa Cherry-Pick con Precaución: Dado que cherry-pick puede alterar la historia de tu proyecto de manera significativa, úsalo con cuidado y solo cuando sea absolutamente necesario.
  • Comprueba Dos Veces Antes de Aplicar: Asegúrate siempre de que estás aplicando el commit correcto a la rama adecuada.

Conclusión

Cherry-pick es una herramienta excepcionalmente útil en el arsenal de Git, proporcionando una gran flexibilidad para manejar cambios específicos entre ramas. Si bien es potente, viene con la necesidad de una gestión cuidadosa para evitar complicaciones. Espero que este tutorial te haya proporcionado una comprensión clara de cómo utilizar cherry-pick eficazmente y cómo puede mejorar tu flujo de trabajo en proyectos de desarrollo de software.

¡Qué tengas un feliz coding!