Salta el contingut
 

Reserva de canvis (stash)

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Reserva de canvis (stash)

La reserva de canvis o stash en Git es un magatzem que permet guardar temporalment els canvis que encara no es volen confirmar (commit).

Aquesta funció és útil si heu de realitzar alguna acció de Git que, d'altra manera, vos faria perdre els canvis que heu realitzat al directori de treball.

  • Canviar de branca.
  • Incorporar canvis d'una altra branca (merge, rebase o pull).

La reserva de canvis permet guardar aquests canvis temporalment i recuperar-los posteriorment quan siga necessari.

Preparació repositori

Inicialitzem un repositori amb canvis en el fitxer README.md i una branca addicional feature/documentacio on s'han fet canvis al mateix fitxer.

jpuigcerver@fp:~ $ mkdir -p ~/git_stash
jpuigcerver@fp:~ $ cd ~/git_stash
jpuigcerver@fp:~/git_stash $ git init
Initialized empty Git repository in ~/git_stash/.git/
jpuigcerver@fp:~/git_stash (main) $ git branch -m main
jpuigcerver@fp:~/git_stash (main) $ echo "# Reserva de canvis" > README.md
jpuigcerver@fp:~/git_stash (main) $ git add README.md
jpuigcerver@fp:~/git_stash (main) $ git commit -m "Commit inicial"
[main (root-commit) fba8bc4] Commit inicial
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
jpuigcerver@fp:~/git_stash (main) $ echo "Repositori d'exemple amb reserva de canvis" >> README.md
jpuigcerver@fp:~/git_stash (main) $ git commit -a -m "README: Descripció"
[main f4e28c6] README: Descripció
 1 file changed, 1 insertion(+)
jpuigcerver@fp:~/git_stash (main) $ git checkout -b feature/documentacio
Switched to a new branch 'feature/documentacio'
jpuigcerver@fp:~/git_stash (feature/documentacio) $ echo "" >> README.md
jpuigcerver@fp:~/git_stash (feature/documentacio) $ echo "## Documentació" >> README.md
jpuigcerver@fp:~/git_stash (feature/documentacio) $ echo "- https://git-scm.com/docs/git-stash" >> README.md
jpuigcerver@fp:~/git_stash (feature/documentacio) $ git commit -a -m "README: Documentació"
[feature/documentacio 305357f] README: Documentació
 1 file changed, 3 insertions(+)
jpuigcerver@fp:~/git_stash (feature/documentacio) $ git checkout main
Switched to branch 'main'
jpuigcerver@fp:~/git_stash (main) $ git lga
* 305357f - (0 seconds ago) README: Documentació - Joan Puigcerver (feature/documentacio)
* f4e28c6 - (0 seconds ago) README: Descripció - Joan Puigcerver (HEAD -> main)
* fba8bc4 - (0 seconds ago) Commit inicial - Joan Puigcerver

Crear una reserva de canvis

La comanda git stash permet guardar els canvis que s'han realitzat al directori de treball.

git stash [-m <missatge>]

Aquesta comanda inclourà els canvis a una pila de canvis:

  • Els nous canvis es guardaran a la primera posició del stash com a stash@{0}.
  • La resta de canvis es desplaçaran una posició a la dreta, incrementant l'índex en 1.

A més, es pot afegir un missatge al stash per identificar millor els canvis guardats.

Reservar de canvis amb stash

Figura 1. Reservar canvis amb stash

Exemple: Crear una reserva de canvis

En aquest exemple, es guardaran els canvis realitzats al fitxer README.md al stash.

Com que canviar a la branca feature/documentacio sobreescriuria el contingut de README.md, Git no ens ho permet i ens recomana reservar els canvis o confirmar-los.

jpuigcerver@fp:~/git_stash (main) $ echo "" >> README.md
jpuigcerver@fp:~/git_stash (main) $ echo "L'ordre git stash permet reservar els canvis temporalment per a poder fer altres tasques." >> README.md
jpuigcerver@fp:~/git_stash (main) $ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
jpuigcerver@fp:~/git_stash (main) $ git checkout feature/documentacio
error: Your local changes to the following files would be overwritten by checkout:
    README.md
Please commit your changes or stash them before you switch branches.
Aborting
jpuigcerver@fp:~/git_stash (main) $ git stash -m "Text git stash"
Saved working directory and index state On main: Text git stash
jpuigcerver@fp:~/git_stash (main) $ git status
On branch main
nothing to commit, working tree clean
jpuigcerver@fp:~/git_stash (main) $ git checkout feature/documentacio
Switched to branch 'feature/documentacio'
jpuigcerver@fp:~/git_stash (feature/documentacio) $ git checkout main
Switched to branch 'main'

Mostrar les reserves de canvis

Per mostrar els stash existents, cal executar la comanda:

git stash list

Aquesta comanda mostrarà una llista amb els stash existents, identificats per l'índex i el missatge que s'ha afegit al stash.

Exemple: Mostrar les reserves de canvis
jpuigcerver@fp:~/git_stash (main) $ git stash list
stash@{0}: On main: Text git stash

Mostrar els canvis d'una reserva

Els canvis guardats en una reserva de canvis poden ser consultats mitjançant l'acció show. Aquesta acció mostrarà els fitxers que s'han canviat.

git stash show [-p] [index]

Addicionalment, podem mostrar els canvis (diff) mitjançant l'opció -p.

També es pot indicar l'índex del stash que es vol consultar. Si no s'indica, mostrarà per defecte el stash@{0}.

Exemple: Mostrar els canvis d'una reserva
jpuigcerver@fp:~/git_stash (main) $ git stash show
 README.md | 2 ++
 1 file changed, 2 insertions(+)
jpuigcerver@fp:~/git_stash (main) $ git stash show -p
diff --git a/README.md b/README.md
index dd979cc..a0acb65 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 # Reserva de canvis
 Repositori d'exemple amb reserva de canvis
+
+L'ordre git stash permet reservar els canvis temporalment per a poder fer altres tasques.

Recuperar els canvis

Els canvis reservats poden recuperar-se mitjançant l'acció apply.

git stash apply [index]

Aquesta acció aplicarà els canvis guardats al directori de treball.

També es pot indicar l'índex del stash que es vol aplicar. Si no s'indica, s'aplicarà per defecte el stash@{0}.

Recuperar canvis amb stash apply

Figura 2. Recuperar canvis amb stash apply

Si a més, volem esborrar la reserva de canvis, podem utilitzar l'opció pop.

git stash pop [index]

Recuperar canvis i esborrar la reserva amb stash pop

Figura 3. Recuperar canvis i esborrar la reserva amb stash pop

Exemple: Recuperar els canvis
jpuigcerver@fp:~/git_stash (main) $ git status
On branch main
nothing to commit, working tree clean
jpuigcerver@fp:~/git_stash (main) $ git stash apply
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
jpuigcerver@fp:~/git_stash (main) $ git diff
diff --git a/README.md b/README.md
index dd979cc..a0acb65 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
 # Reserva de canvis
 Repositori d'exemple amb reserva de canvis
+
+L'ordre git stash permet reservar els canvis temporalment per a poder fer altres tasques.
jpuigcerver@fp:~/git_stash (main) $ git stash list
stash@{0}: On main: Text git stash

Descartar els canvis

Una reserva de canvis pot ser eliminada de la pila de canvis mitjançant l'acció drop.

git stash drop [index]

També es pot indicar l'índex del stash que es vol descartar. Si no s'indica, es descartarà per defecte el stash@{0}.

Exemple: Descartar els canvis
jpuigcerver@fp:~/git_stash (main) $ git stash list
stash@{0}: On main: Text git stash
jpuigcerver@fp:~/git_stash (main) $ git stash drop
Dropped refs/stash@{0} (6454e0cf44cfd7835b14d1baec30e4cdf71a8640)
jpuigcerver@fp:~/git_stash (main) $ git stash list

Comentaris