Conceptos básicos de Git (parte 5)

17 de octubre de 2016
3 min. de lectura
Como hacer una presentación exitosa

Continuamos con el desarrollo de la serie “Conceptos básicos de Git” en la que describimos los conceptos básicos del manejo de versiones usando Git.

En el capítulo anterior dimos un vistazo a las ramas, un concepto fundamental de Git y en general de los sistemas de versionamiento. En esta ocasión vamos a ver dos comandos que nos ‘salvan la vida’ en el día a día: 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 comoupstream) 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. 

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:

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

Restauramos los cambios almacenados temporalmente: 

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: 

Lo que arrojará algo como esto: 

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: 

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

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:

 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: 

 Para poder ejecutar el cherry-pick, se necesitan los identificadores de los commits que vamos a aplicar. Para esto revisamos el log: 

Lo que arroja un historial con commits similar a esto: 

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

 

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

Cabe mencionar que el comando cherry-pick puede fallar por encontrar conflictos, por lo cual, si queremos revertirlo, ejecutamos el comando: o el siguiente comando, dado que al fin y al cabo se está realizando un merge: 

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

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

Suscríbete