Stash n’est juste cool parceque ça veut dire joint en anglais, c’est aussi une fabuleuse fonctionalité de Git.
Quand vous devez faire un merge
ou un checkout
mais qu’il y a des modifications non sauvegardées en cours sur vos fichiers, Git va vous demander d’y remedier. Soit vous commitez les changements, soit vous les annulez, sans quoi pas de merge
ni de checkout
possible.
Dans d’autres cas vous travaillez sur un truc à moitié fini que vous ne voulez pas commiter encore (parceque c’est moche). Mais un bug est découvert qui prendra une seconde à corriger. Ca fait chier de mettre à l’eau toute les modifs ou de créer une branche pour ça.
Il existe une autre solution: Git stash
Git stash
pour sauvegarder les modifications
Mettez vous dans le dossier racine de votre projet et modifiez un fichier. Faites ensuite ‘git stash
‘ (ça ne craint rien).
Toutes les modifications disparaissent ! (ça ne craint rien j’ai dis !)
Vos fichiers se retrouvent dans l’état dans lequel il était à la dernière sauvegarde. Ils ont été “stashé”, c’est à dire que les modifications on été sauvegardées dans un endroit à part spécialement pour ça.
Vous pouvez alors faire toutes les opérations que vous voulez. Quand vous avez terminé…
Git stash apply
pour restaurer les modifications
Et vos fichiers se retrouvent à nouveau modifiés. Git stash
permet en effet de sauvegarder temporairement des modifications pour les remettre à plus tard. Ce n’est pas un moyen sur de faire des backup, ni un remplacement pour l’historique normal de Git. C’est un juste un moyen pratique de dire “je verrai ça plus tard“: git stash
, truc à faire, et git stash apply
.
Git stash list
pour voir la liste des stashs
On peut faire plusieurs stashs à droite et gauche. Comment s’y retrouver ?
Git stash list
vous donnera la liste des stashs de ce repository:
$test(master) sam$ git stash list stash@{0}: WIP on master: bd30f7b a stash@{1}: WIP on master: bd30f7b a |
Pour appliquer un stash en particulier, par exemple “stash@{0}
”
git stash apply stash@{0} |
Pour savoir ce qu’il y a dans un stash:
git stash show stash@{0} |
Aller plus loin avec git stash
Si un stash commence à être précieux, et que vous sentez que vous aller devoir bosser dessus pas mal de temps, vous pouvez toujours décider de finalement faire une branche avec:
git stash branch stash@{0} |
Pour supprimer un stash:
git stash drop stash@{0} |
Pour toutes ces commandes, si on ne précise pas le stash ciblé, le dernière créé sera utilisé par défaut.
La plupart du temps on créé un stash de manière temporaire, donc plutot que de faire un stash apply
puis un stash drop
, on peut faire:
git stash pop |
Cela fait un stash apply
avec le stash le plus récent, mais en plus cela supprime le stash de la liste.
Comme les stashs sont comme des commits ordinaires, mais simplement en dehors de tout historique et de toute branche, on peut faire toutes les operations qu’on fait sur les commit sur les stashs: merge
, checkout
, patch
, etc. Cela dit c’est un usage avancé que je ne recommande pas au débutant car il faut être capable de visualiser l’état de son travail du point de vue de Git pour s’en sortir.
Si vous découvrez Git, vous n’avez vraiment que deux commandes dont ils faut se souvenir:
git stash git stash apply |
Super, je me disais justement qu’il fallait que je regarde ça ! Ça tombe à pic !
“il faut être capable de visualisé l’état” *visualiser
Fôt corijée, mersi msiou ;)
Bonsoir,
Après votre première présentation des fonctionnalités de base de Git, c’était une bonne idée de détailler un peu plus les fonctionnalités de ce bel outil de versionning.
Sinon, il est vrai que git stash est fort utile.
Bonne soirée,
Oui d’ailleurs il serait bon de faire un tuto plus détaillé pas à pas. On va voir si y a le temps.
@max: tu nous fais un tampon “merci” ?
mouiiiii
(Pour référence, vu le délai du présent commentaire ^^;)
Pour aller plus loin avec la notion de sauvegarde des changements en cours, on peut utiliser des piles de patchs (comme MQ avec Mercurial). Il s’agit non pas de sauvegarder un seul changement / commit, mais de pouvoir travailler en même temps sur plusieurs (pour par ex. découper un gros commit à venir en plusieurs petits ayant chacun un sens propre). Pour git, j’apprécie stgit (page du projet), mais il en existe d’autres (page dédiée du wiki de git, autre page (moins dédiée mais plus complète et à jour) des outils en vrac du wiki de git).