Aller au contenu

git stash

Définition

La commande git stash met de côté les modifications apportées à votre copie de travail afin que vous puissiez effectuer un autre travail, puis revenir et les réappliquer.

stash

Mise en attente de votre travail

La commande git stash prend à la fois les modifications préparées (staged) et non préparées (unstaged) non validées, les sauvegarde pour une utilisation ultérieure, puis les supprime de votre copie de travail. Tout d'abord, vous pouvez exécuter git status pour voir l'état des modifications. Ensuite, exécutez git stash pour mettre les modifications en attente :

Git stash

bash
git status
bash
On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html

Git stash

bash
$ git stash
bash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Git stash

bash
$ git status
bash
On branch master
nothing to commit, working tree clean

Réapplication de vos modifications en attente

La commande git stash pop supprime les modifications de votre stash et les réapplique à votre copie de travail.

Une autre méthode consiste à exécuter git stash apply si vous souhaitez réappliquer les modifications tout en les conservant dans votre stash :

Git stash

bash
git status
bash
On branch master
nothing to commit, working tree clean

Git stash

bash
git stash pop
bash
On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

Mise en attente de fichiers non suivis ou ignorés

La commande git stash mettra en attente les modifications ajoutées à votre index (modifications préparées) et les modifications apportées aux fichiers actuellement suivis par Git (modifications non préparées). Elle ne mettra pas en attente les nouveaux fichiers dans la copie de travail qui n'ont pas encore été préparés, ni les fichiers ignorés. Dans ces cas, l'option git stash -u (ou --include-untracked) permet de mettre en attente les fichiers non suivis.

Git stash

bash
git stash -u

Vous pouvez également ajouter les modifications des fichiers ignorés en utilisant l'option -a (ou --all) lors de l'exécution de git stash.

Git stash

bash
git stash -a

Stashes multiples

Vous pouvez exécuter git stash plusieurs fois pour créer plusieurs stashes, puis exécuter git stash list pour les afficher. Par défaut, les stashes sont identifiés comme "WIP" (travail en cours). Ils se basent sur la branche et les validations à partir desquelles le stash a été créé.

Git stash

bash
git stash list
bash
stash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 5002d47 our new homepage
stash@{2}: WIP on master: 5002d47 our new homepage

Il est recommandé d'ajouter du contexte avec git stash push -m "message".

Par défaut, git stash pop réappliquera le dernier stash créé : stash@{0}.

Vous pouvez choisir quel stash réappliquer de cette manière :

Git stash

bash
git stash pop stash@{3}
bash
Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

Affichage des différences des stashes

Utilisez git stash show pour afficher un résumé d'un stash :

Git stash

bash
git stash show
bash
index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)

Vous pouvez également utiliser les options -p ou --patch pour afficher la différence complète d'un stash :

Git stash

bash
git stash show -p
bash
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>

Stashes partiels

Git permet de choisir si vous souhaitez mettre en attente un seul fichier, plusieurs fichiers ou des modifications individuelles au sein des fichiers. La commande git stash -p parcourt chaque hunk (un morceau de modification dans Git) dans la copie de travail et vous demande si vous souhaitez le mettre en attente ou non :

Git stash

bash
git stash -p
bash
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? n

Commandes de hunk

CommandeDescription
/Rechercher un hunk par expression régulière.
?Afficher l'aide.
nNe pas mettre le hunk en attente.
aMettre ce hunk et tous les hunks suivants dans le fichier en attente.
dNe pas mettre ce hunk ni aucun des hunks suivants dans le fichier en attente.
eModifier manuellement le hunk actuel
qQuitter (les hunks sélectionnés seront mis en attente)
sDiviser le hunk en hunks plus petits.
yMettre le hunk en attente.

Création d'une branche à partir d'un stash

Vous pouvez créer une nouvelle branche pour y appliquer vos modifications en attente avec git stash branch :

Git stash

bash
git stash branch add-stylesheet stash@{1}
bash
Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

Nettoyage du stash

Vous pouvez supprimer le stash avec git stash drop :

Git stash

bash
git stash drop stash@{1}
bash
Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)

Si vous utilisez git stash clear, tous les stashes seront supprimés :

Git stash

bash
git stash clear

Pratique

Quelles sont les fonctionnalités et les capacités de la commande 'git stash' ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.