HEADER_lecciones_de_software

Cómo aplicar Git Stash y Git Cherry-pick

por Jhon López, el 17 de octubre de 2016

Cómo aplicar GIT Stash y Git Cherry-pick

En el capítulo Conceptos básicos de Git (parte 4) dimos un vistazo a las ramas, un concepto fundamental de Git y en general de los sistemas de versionamiento. En el actual,  hablaremos de los conceptos básicos del manejo de versiones usando Git. También veremos dos comandos que nos ‘salvan la vida’ en el día a dia: git stash y git cherry-pick.

Stash

El comando git stash se podría resumir como un guardado temporal del estado actual de los archivos en el working copy. Esto es un snapshot del estado actual del repositorio, sin llegar a ser marcado como un commit.

Este comando es muy útil en situaciones donde tenemos que actualizar la rama sobre la que estamos trabajando con cambios de la rama padre (conocida en el mundo de Git como upstream) y el trabajo actual aún está en progreso, por lo que no es seguro (ni recomendado) hacer un commit con ello. Si los cambios que queremos traer de la rama padre no tienen conflictos con el trabajo en progreso, con sólo ejecutar git pull origin ramapadre bastaría. En el caso contrario, Git alertará que el pull no se puede hacer pues hay cambios que generarían conflictos y en este punto entra a jugar un papel importante el stash.

El escenario sería el siguiente:

  • Creamos una rama para desarrollar una nueva funcionalidad, a partir de la rama de desarrollo.

1

git checkout -b feature/newfunc

  • Empezamos a desarrollar nuestra funcionalidad sin hacer un commit.
  • Hay un cambio que otra persona del equipo realizó e integró en la rama de desarrollo (develop), que debemos incluir en nuestro desarrollo para poder continuar.
  • El trabajo en progreso no puede ser pasado a un commit, pues no se ha terminado ni probado, por lo que almacenamos temporalmente un snapshot del repositorio con el estado actual para no perder los cambios:

1

git stash

  • Actualizamos la rama actual con los cambios de la rama padre:

1

git pull origin develop

  • Restauramos los cambios almacenados temporalmente:

1

git stash apply

Luego de aplicar el stash, los cambios en el working copy (o nuestros archivos del repositorio) con nuestro trabajo en progreso deben haber vuelto.

El stash nos da además la opción de listar los “paquetes” de trabajo en progreso que se han almacenado con el comando:

1

git stash list

Lo que arrojará algo como esto:

1

2

stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation

stash@{1}: On master: 9cc0589... Add git-stash

Cuando ejecutamos el comando git stash apply, Git asume que queremos aplicar el último stash almacenado. Si lo que se necesita es aplicar un stash anterior, podemos ejecutar el comando:

1

git stash apply --index stash@{1}

Para más información acerca del comando, ver la página oficial de Git o ejecutar el siguiente comando:

1

git stash --help

 Cherry-pick

Una interesante herramienta que proporciona Git es el comando cherry-pick, con el que se pueden aplicar cambios efectuados en commits específicos a la rama actual. Para que elcherry-pick funcione correctamente, la rama actual no debe tener cambios (debe estar en “clean status”).

Este comando es muy útil en situaciones donde se necesita aplicar cambios que han sido ya integrados en una rama (por ejemplo cambios en una rama de un hotfix con una corrección de un bug encontrado en producción integrado a la rama master) a una segunda rama, sin integrar directamente la rama de hotfix, pues se podrían traer cambios de la rama master a la segunda rama que no deberían aplicarse (como configuraciones específicas de producción o cambios que se liberarán en versiones posteriores).

Un escenario sería el siguiente:

  • Se genera una rama para corregir un bug en producción:

1

git checkout -b hotfix/bug

  • Se corrige el bug y se hace el/los commits necesarios (como regla general de versionamiento, se deben hacer commits granulares y descriptivos)
  • Se integra la rama hotfix a la rama master:
  • 1
  • 2
  • git checkout master
  • git merge hotfix/bug
  • Para poder ejecutar el cherry-pick, se necesitan los identificadores de los commits que vamos a aplicar. Para esto revisamos el log:

1

git log

Lo que arroja un historial con commits similar a esto:

1

2

3

4

5

commit 3566979e4145d5bd3891a9f899b715577eeff82b

Author: jaiversin <jaiversin@gmail.com>

Date: Sun Jun 19 23:09:26 2016 -0500

Mensaje del commit

  • Nos “paramos” en la rama a la que queremos aplicar el commit específico:

1

git checkout feature/otherbranch

  • Y aplicamos el commit específico a la rama actual con el comando cherry-pick:

1

git cherry-pick 3566979e4145d5bd3891a9f899b715577eeff82b

Cabe mencionar que el comando cherry-pick puede fallar por encontrar conflictos, por lo cual, si queremos revertirlo, ejecutamos el comando:

1

git cherry-pick --abort

o el siguiente comando, dado que al fin y al cabo se está realizando un merge:

1

git reset --merge

Para más información acerca del comando, ver la página oficial de Git o ejecutar el comando:

1

git cherry-pick --help

Esto ha sido todo por el episodio actual. Hemos visto dos comandos bastante útiles en el trabajo con git. En el siguiente capítulo tendremos el manejo de flujos de trabajo con Git.

Lee el especial completo: 

Nuevo llamado a la acción

 

Temas:Desarrollo de Software

Lecciones Pragma

Lecciones en Academia Pragma

Aquí encontrarás tutoriales técnicos para que apliques en temas de desarrollo de software, cloud, calidad en software y aplicaciones móviles. 

También puedes visitar nuestro Blog con contenido actual sobre Transformación Digital, Marketing, Conocimiento de Usuario y más. 

Blog

Suscríbete a la academia

Descarga la Guía para trabajar con ambientes IBM Websphere Portal