Article

Seleccionando commits: Cherry-pick

Tech & innovation

Seleccionando commits: Cherry-pick

En el equipo de desarrollo de Runroom hemos realizado una serie de post explicativos sobre los comandos de Git menos comunes, como material de formación interno y hemos visto oportuno compartir los más interesantes con la comunidad de desarrolladores, esperando que os sean útiles. Estos son los comandos de los que os vamos a hablar en este y los siguientes artículos:

En este primer post veremos como funciona el comando de cherry-pick. ¡Vamos a ello! Trabajando con git es habitual usar diferentes ramas en un mismo proyecto, por ejemplo, podemos estar usando una rama master con el código que tenemos en producción y una rama development donde trabajamos en la siguiente iteración. También podemos tener varias ramas específicas para nuevos desarrollos o pequeños arreglos (hotfix ) que se van uniendo a la rama de development. De esta forma puede suceder que, en un momento dado, queramos aplicar algunos de los cambios que hemos hecho en otra rama sin tener que hacer un merge completo. Pongamos un ejemplo práctico, digamos que hemos estado trabajando en las nuevas funcionalidades de nuestra web en la rama development. Entre estas funcionalidades hemos añadido la posibilidad de hacer login mediante Facebook y ahora queremos aplicar este cambio a la versión actual de nuestra web que tenemos en la rama master. De hacer un merge podríamos aplicar esta funcionalidad en concreto, pero también estaríamos aplicando los otros cambios de development que aún no queremos publicar. ¿Cómo lo hacemos?

Git Cherry Pick

Por suerte git nos da una solución sencilla para estos casos con el comando cherry-pick. Este comando permite coger uno o varios commits de otra rama sin tener que hacer un merge completo. Así, gracias a cherry-pick, podríamos aplicar los commits relacionados con nuestra funcionalidad de Facebook en nuestra rama master sin necesidad de hacer un merge.

¿ Cómo utilizar git cherry-pick ?

Para usar cherry-pick lo único que necesitamos saber es el commit específico que queremos aplicar en nuestra rama. Para nuestro ejemplo, digamos que el commit que contiene la funcionalidad que nos interesa está en el commit 13f03ab, para aplicarla en nuestra rama bastaría con este comando: (master) $ git cherry-pick 13f03ab Hay que tener en cuenta que este comando crea un nuevo commit, por lo que antes de usar cherry-pick no debemos de tener ningún archivo modificado que no haya sido incluido en un commit. También, como pasa habitualmente con git, cherry-pick dispone de varias opciones que podemos usar para mejorar nuestro flujo de trabajo. Por ejemplo, en el caso de querer aplicar más de un commit, nos basta con indicárselos a cherry-pick.   (master) $ git cherry-pick 13f03ab fe834e9   Por defecto cherry-pick mantiene el mensaje de commit original, por lo que la opción -x puede resultarnos interesante. Esta opción modifica el mensaje para añadir una referencia al commit original, de esta forma podremos saber de donde nos hemos traído este commit.   (master) $ git cherry-pick -x 13f03ab (master) $ git log --pretty="%h %s %b" 8eac365 Add Facebook login (cherry picked from commit 13f03ab)   Otras opciones interesantes de cherry-pick son -e, que nos permite editar el mensaje del commit en lugar de usar el original. Y la opción -n que nos aplicará los cambios pero no hará ningún commit. De esta forma, usando git cherry-pick, podríamos aplicar nuestra la funcionalidad de Facebook de la rama development sin tener que hacer un merge. Aunque no se trata de una de una de las herramientas más usadas de git, en ocasiones resulta muy práctica y conocer su funcionamiento nos puede ahorrar tiempo cuando trabajamos con varias ramas.   Este artículo es parte de la serie sobre comandos de Git y está escrito por Ivan Ribas y Aitor Errasti. Esperamos que hayas encontrado información útil y nos encantará escuchar tu experiencia y contestar a tus dudas a través de los comentarios de este post o enviándonos un tweet con el hashtag #askrunroom.

15 Jun. 2017

Equipo Developers

Runroomer

Agile Digital Intelligence