Inicio > Git > git stash – Guardando modificaciones sin commit con GIT

git stash – Guardando modificaciones sin commit con GIT

En el último articulo estuve hablando de Git y de Java. Esta vez voy a continuar con Git, pero con sus comandos básicos. Vamos a suponer el mismo depósito que hemos usado en los antiguos post, con las dos ramas : master y experimental.

Partimos del depósito que apunta a la rama experimental. Supongamos que hemos realizado un cambio en el pom del proyecto y que no queremos aún comitear porque no estamos seguros. Y que al mismo tiempo se nos pide hacer una modificación en la rama master. Lo que estaríamos tentados a hacer es un checkout de master para recuperar la rama y hacer los cambios. Eso nos daría:

joan@jomaora:testMockito (experimental *%)$ git co master
M pom.xml
Switched to branch 'master'
joan@jomaora:testMockito (master *)$ git st
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: pom.xml
#
no changes added to commit (use "git add" and/or "git commit -a")

Las modificaciones del pom.xml son trasladadas a la rama master. Pero el cambio que queremos no es sobre este archivo. Podemos entonces guardar esta modificacion local en la rama especifica sin necesidad de comitearla. Para ello, utilisaremos el comando git stash. Stash significa esconder. Y en grandes rasgos eso es lo que se hace. Las modificaciones se esconden en una lista temporal para luego reutilisarla y aplicarlas si necesario.

  • git stash [save [–patch] [-k|–[no-]keep-index] [-q|–quiet] [-u|–include-untracked] [-a|–all] [<message>]]

Entonces volvamos a la rama experimental. Y escondamos la modificación:

joan@jomaora:testMockito (master *)$ git co experimental
M pom.xml
Switched to branch 'experimental'

joan@jomaora:testMockito (experimental *%)$ git stash save -a "Saving modifs on pom.xml"
Saved working directory and index state On experimental: Saving modifs on pom.xml
HEAD is now at 824dfff Modif en pom

joan@jomaora:testMockito (experimental $%)$ git st
# On branch experimental
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# xml/
nothing added to commit but untracked files present (use "git add" to track)

Habiendo escondido los cambios a reutilizar, podemos pasar a la rama master. De paso verificamos que tras el checkout, no hubo modificaciones que se propagaron.

joan@jomaora:testMockito (experimental $%)$ git co master
Switched to branch 'master'
joan@jomaora:testMockito (master $)$ git st
# On branch master
nothing to commit (working directory clean)

Ahora vamos seguir el mismo principio. Modificamos otro archivo, pero no lo vamos a commitear. Vamos a guardarlo en la lista de stashes.

joan@jomaora:testMockito (master $)$ git st
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: src/main/java/com/jomaora/app/App.java
#
no changes added to commit (use "git add" and/or "git commit -a")

joan@jomaora:testMockito (master *$)$ git stash save -a "Modifying App.java"
Saved working directory and index state On master: Modifying App.java
HEAD is now at 6290c34 Merge branch 'experimental'

joan@jomaora:testMockito (master $)$ git st
# On branch master
nothing to commit (working directory clean)

Ahora bien. Hemos creado modificaciones y las hemos escondido sin modificar el depósito. Pero, ¿cómo podemos verlos?

  • git stash list [<options>]

Este comando nos va a listar los stashes con el mensaje que le agregamos y en la rama en la que los cambios fueron hechos:

joan@jomaora:testMockito (master $)$ git stash list
stash@{0}: On master: Modifying App.java
stash@{1}: On experimental: Saving modifs on pom.xml

Ya viendo los cambios ahora procedamos a recuperarlos y aplicarlos en el depósito.

  • git stash ( pop | apply ) [–index] [-q|–quiet] [<stash>]

Hay dos maneras de aplicar los stashes que hemos guardado. Supongamos que vamos a la rama experimental y que queremos aplicar el primer stash que guardamos.

joan@jomaora:testMockito (master $)$ git co experimental
warning: unable to rmdir xml: Le dossier n'est pas vide
Switched to branch 'experimental'
joan@jomaora:testMockito (experimental $%)$ git stash apply stash@{1}
# On branch experimental
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: pom.xml
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# xml/
no changes added to commit (use "git add" and/or "git commit -a")

Este comando permite, dando como parámetro la identificación del stash, aplicar los cambios del stash. Por eso el archivo pom.xml aparece de nuevo como modificado. Esta operación no implicara cambios en la lista de stashes:

joan@jomaora:testMockito (experimental *$%)$ git stash list
stash@{0}: On master: Modifying App.java
stash@{1}: On experimental: Saving modifs on pom.xml

Deshagamos el cambio y pasemos a la rama master:

joan@jomaora:testMockito (experimental *$%)$ git co -- pom.xml
joan@jomaora:testMockito (experimental $%)$ git st
# On branch experimental
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# xml/
nothing added to commit but untracked files present (use "git add" to track)

joan@jomaora:testMockito (experimental $%)$ git co master
Switched to branch 'master'

Apliquemos de nuevo el primer stash, pero esta vez utilisemos el otro comando

joan@jomaora:testMockito (master $)$ git stash pop stash@{1}
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: pom.xml
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{1} (61936a23b808e4f85e3619529531702536c1c087)

Al final, el mensaje de GIT nos indica que el stash fue retirado de la pila de stashes. Comprobemoslo:

joan@jomaora:testMockito (master *$)$ git stash list
stash@{0}: On master: Modifying App.java

Ahora si queremos agregar el stash que nos queda, sólo hacemos

joan@jomaora:testMockito (master *$)$ git stash pop
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: pom.xml
# modified: src/main/java/com/jomaora/app/App.java
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (e1dfff9db0be580f6a029d07a26d64cd883adc3d)

Cuando no se especifica el stash, el primer stash de la pila de stashes es el que es tenido en cuenta.

Con esta opción, nuestras dos modificaciones locales que habíamos escondido han sido de nuevo incluidas en el depósito. Pero ahora supongamos que queremos esconder de nuevo la modificación del archivo App.java pero queremos guardar la modificación del pom. En este caso vamos a aprovechar la capacidad selectiva del commando git stash.

  • git stash [save [–patch] ]

Esta opción del commando stash va a listar cada una de las modificaciones locales y nos presentará un menú de posibilidades.

Stash this hunk [y,n,q,a,d,/,e,?]?

Para ver lo que significa cada opcion puedes consultar aqui -> http://stackoverflow.com/questions/10605405/what-does-each-of-the-y-n-q-a-d-k-j-j-g-e-stand-for-in-context-of-git-p

Para resumir, seleccionaremos ‘n’ cuando se nos pregunte por pom.xml y ‘y’ cuando se nos pregunte por App.java.

joan@jomaora:testMockito (master *)$ git stash save --patch "Resaving App.java"
diff --git a/pom.xml b/pom.xml
index 88f8794..a3fa5ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
<groupId>com.jomaora.app</groupId>
<artifactId>testMockito</artifactId>
<packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
+ <version>2.0-SNAPSHOT</version>
<name>testMockito</name>
<build>
<plugins>
Stash this hunk [y,n,q,a,d,/,e,?]? n

diff --git a/src/main/java/com/jomaora/app/App.java b/src/main/java/com/jomaora/app/App.java
index b313ad8..8c8cbb1 100644
--- a/src/main/java/com/jomaora/app/App.java
+++ b/src/main/java/com/jomaora/app/App.java
@@ -1,8 +1,8 @@
package com.jomaora.app;

/**
- Adding javadoc
- *
+ * Adding javadoc
+ * @author Joan Ortega
*/
public class App
{
Stash this hunk [y,n,q,a,d,/,e,?]? y

Saved working directory and index state On master: Resaving App.java

joan@jomaora:testMockito (master *$)$ git stash list
stash@{0}: On master: Resaving App.java

  • git stash show

Si queremos informaciones sobre un stash, la opcion show no es util:

joan@jomaora:testMockito (master *$)$ git stash show stash@{0}
src/main/java/com/jomaora/app/App.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

  • git stash clear

Si queremos limpiar la pila de stashes

joan@jomaora:testMockito (master *$)$ git stash clear
joan@jomaora:testMockito (master *)$ git stash list

Y ahora para dejar nuestro deposito como lo encontramos antes, siemplemente hagamos un revert de la modificacion local del pom

joan@jomaora:testMockito (master *)$ git co -- pom.xml
joan@jomaora:testMockito (master)$

Et puis voilà!

  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Hype Driven Development

coz' geeks love new stuff !

My experiments with SCRUM

Site to discuss Agile (Scrum, XP, etc) concepts and ideas.

CommitStrip

Mi propia cheatsheet...

Chris Aniszczyk's (zx) diatribe

work. life. open source. diatribes.

GermanTrevi

repositorio de mi mente...

A %d blogueros les gusta esto: