Stashing con Git

La semana pasada hablábamos sobre el manejo de ramas de desarrollo con Git. Hoy voy a hablaros sobre el stashing con Git.

Stashing es un concepto super simple que es increíblemente útil y muy fácil de usar. Si estamos trabajando en nuestro código y necesitamos cambiar a otra rama por cualquier motivo o quizás hacer un pull en el repositorio, y no queremos hacer un commit de nuestro trabajo por que se encuentra en un estado parcial, podemos usar stashing.

Para usar Git stashing solo tenemos que ejecutar git stash que lo que hace es congelar nuestros cambios desde nuestro último commit y almacenarlos de forma temporal dejando nuestro diectorio de trabajo completamente limpio.

En el ejemplo de abajo tengo cambios en mi directorio de trabajo a los que aún no he hecho commit por que no es un trabajo completo.

$ git status
# On branch master
# Changed but not updated:
#   (use "git add file..." to update what will be committed)
#   (use "git checkout -- file..." to discard changes in working directory)
#
#       modified:   http_request.py
#       modified:   inform.py
#       modified:   status.py
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash
Saved working directory and index state WIP on master: e87b43b bugfix for initialize spot
HEAD is now at e87b43b bugfix for initialize spot
$ git status
# On branch master
nothing to commit (working directory clean)

Ahora tenemos el directorio de trabajo limpio igual que si no hubiéramos realizado cambios en los archivos. Ahora podemos cambiar de rama trabajar un rato, hacer un pull y después de realizar nuestro trabajo, podemos volver a recuperar nuestros cambios. Con stash list podemos ver la lista de stashes.

$ git stash list
stash@{0}: WIP on master: e87b43b bugfix for initialize spot
Podemos ver en que consisten los cambios usando stash show stash@{#}
$ git stash show stash@{0}
http_request.py |    1 +
 inform.py       |    1 +
 status.py       |    1 +
 3 files changed, 3 insertions(+), 0 deletions(-)
Podemos utilizar las herramientas normales de git sobre nuestros stash como git diff
$ git diff stash@{0}
diff --git a/http_request.py b/http_request.py
index de10111..e69de29 100644
--- a/http_request.py
+++ b/http_request.py
@@ -1 +0,0 @@
-import sys
diff --git a/inform.py b/inform.py
index de10111..e69de29 100644
--- a/inform.py
+++ b/inform.py
@@ -1 +0,0 @@
-import sys
diff --git a/status.py b/status.py
index de10111..e69de29 100644
--- a/status.py
+++ b/status.py
@@ -1 +0,0 @@
-import sys
Y finalmente podemos aplicar los cambios del stash a nuestro directorio de trabajo con git stash appy stash@{#}
$ git stash apply stash@{0}
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   http_request.py
#       modified:   inform.py
#       modified:   status.py
#
no changes added to commit (use "git add" and/or "git commit -a")
Si solo tenemos un stash podemos utilizar tranquilamente git stash apply


Más en Genbeta Dev | Manejo de ramas de desarrollo con git
Más Información | Manual de Git Stash

Portada de Genbeta