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.

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
git statusOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlGit stash
$ git stashSaved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepageGit stash
$ git statusOn branch master
nothing to commit, working tree cleanRé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
git statusOn branch master
nothing to commit, working tree cleanGit stash
git stash popOn 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
git stash -uVous 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
git stash -aStashes 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
git stash liststash@{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 homepageIl 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
git stash pop stash@{3}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
git stash showindex.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
git stash show -pdiff --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
git stash -pdiff --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,?]? nCommandes de hunk
| Commande | Description |
|---|---|
| / | Rechercher un hunk par expression régulière. |
| ? | Afficher l'aide. |
| n | Ne pas mettre le hunk en attente. |
| a | Mettre ce hunk et tous les hunks suivants dans le fichier en attente. |
| d | Ne pas mettre ce hunk ni aucun des hunks suivants dans le fichier en attente. |
| e | Modifier manuellement le hunk actuel |
| q | Quitter (les hunks sélectionnés seront mis en attente) |
| s | Diviser le hunk en hunks plus petits. |
| y | Mettre 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
git stash branch add-stylesheet stash@{1}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
git stash drop stash@{1}Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Si vous utilisez git stash clear, tous les stashes seront supprimés :
Git stash
git stash clearPratique
Quelles sont les fonctionnalités et les capacités de la commande 'git stash' ?