¿Cómo usar git cherry-pick sin morir en el intento?

Luis Burgos
3 min readOct 13, 2020

--

El cherry pick 🍒, en comandos de Git es el equivalente al sacacorchos en una navaja suiza, siempre será parte de la navaja, pero la utilizamos en ocasiones muy selectas. Si eres un fanático del vino, probablemente lo uses más seguido 🤔.

Aceptémoslo, este comando es “de esos comandos”

Parecen tan amigables, pero resultan en algo inesperado. Fuente del GIF

Y con “de esos comandos” me refiero a aquellos que nos dan miedo ejecutar porque las cosas se pueden salir de nuestro control y llevarnos a pensar que no podremos revertirlo.

Cuando le perdemos el miedo a los comandos de Git, incrementamos nuestras herramientas ante retos diferentes a los del día a día. Incluso si nos encontramos con problemas durante el proceso siempre podemos utilizar el siguiente comando para abortar la operación:

git cherry-pick --abort

Otro ejemplo es el comando git reflog para casos más problemáticos que necesiten de re-escribir la historia, de este comando hablaremos en otra ocasión.

La primera vez que lo usemos se sentirá así:

Como volar por primera vez. Fuente del GIF.

Pero luego de un par de ocasiones, termina siendo así:

No era tan complicado. Fuente del GIF.

Bueno, ¿Y cuáles son los escenarios de uso?

En realidad es difícil recordar todas las ocasiones donde he usado este comando, pero al menos recuerdo 4 muy rebuscadas:

  1. Por alguna razón tengo otra rama donde hice un par de commits que nunca subí al repositorio remoto y necesito uno de esos commits 🤔.
  2. Quiero probar un conjunto de cambios particulares o traerme un commit desde la rama de un compañero 😎.
  3. Estaba trabajando y luego de un par de commits llegué a un punto donde quedé bloqueado, guardé cambios y me moví a trabajar en otra funcionalidad. (Creo que el punto 1 ahora tiene más sentido 🤣)
  4. Un bug encontrado en develop necesita moverse a una rama hotfix que eventualmente se hará merge a master, y así podamos reparar algo en producción 🚒.

📻 Para estos y otros casos igual de rebuscados, presentamos:

git cherry-pick <commit-SHA>

Donde <commit_SHA> es el identificar corto del commit que queremos seleccionar y que está conformado por 7 dígitos (mejor conocido como short SHA-1 o short SHA para los amigos).

Obtener el short SHA-1

La forma más sencilla que conozco es ejecutando:

git log --oneline

En tu terminal podrás ver un listado de commits con su respectivo short SHA y su commit message.

Ejemplo usando el repositorio de ReactJS en Github.

Puedes copiar el short SHA aplicando la vieja confiable, selecciónalo y apreta CMD+V (o CTRL+V dependiendo tu sistema operativo), regresa a tu terminal, muévete a tu rama de trabajo y aplica el comando mágico.

El proceso completo lucirá algo así:

git log --oneline <branch-where-the-commit-is>// Copiamos el short SHA y cerramos el log de commitsgit checkout <my-working-branch>
git cherry-pick <commit-SHA>

¿Y qué hago en caso de conflictos? 😱

Los solucionamos de la misma forma en que lo hacemos durante un merge regular y luego ejecutamos:

git add .
git cherry-pick --continue

Si por alguna razón cambiamos de parecer y queremos abortar la misión ejecutamos:

git cherry-pick --abort

Pro-tip: Lee con atención los mensajes de tu terminal 👀. Si te encuentras con un error, probablemente la terminal te ofrecerá una sugerencia de solución.

Ya para acabar, una única consideración 🙈

El uso del cherry-pick puede generar duplicidad de commits en cuanto a contenido, debido a que este proceso siempre creará un short SHA diferente, recuerda que dos short SHA diferentes harán que Git piense que son historias totalmente diferentes.

¿Quieres ir más a fondo?

Para mayor información puedes consultar la guía que Atlassian tiene, es muy buena, sí Atlassian aquellos que crearon JIRA y Bitbucket 🤷🏻‍♂️.

Te dejo mi Twitter, a veces comparto pensamientos sobre desarrollo de software. Agradecimientos a Heidi Castillo por crear la increíble portada de este artículo!

--

--