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.
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:
1 |
git checkout -b feature/newfunc |
1 |
git stash |
1 |
git pull origin develop |
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 |
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:
1 |
git checkout -b hotfix/bug |
|
|
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 |
1 |
git checkout feature/otherbranch |
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: