Git est un extraordinaire outil en ce qui concerne le versionning de fichiers. J’ai testé ses deux autres concurrents, à savoir SVN et Mercurial et je dois dire que je suis toujours autant in love de Git. Pour info le fonctionnement de Mercurial est quasi-identique à celui de Git mais je sais pas je préfère Git. Et puis ce dernier jouit d’une immense communauté sur le net il est donc plus facile de trouver de la doc et des tutos (et puis y a github).
Je voudrais parler de Git stash parce que cette commande est juste super sexy. Elle permet 1) de se la péter en soirée geek et 2) éventuellement de vous sauver la vie, parole de geek.
Git stash
En fait ça sert à mettre rapidement de côté des modifs en cours et de les récupérer tout aussi rapidement. Généralement c’est très pratique pour réaliser une/des manip(s) qui pourrai(en)t entrer en conflit avec nos fichiers qui justement sont trop frais pour être commités.
Prenons un exemple, j’ai fais des modifs genre méga top secrètes et je fais un git status pour voir où j’en suis.
[bob@bob (master =)]$ git status
# On branch master
# Changes not staged for commit:
#
# modified: css/style.css
#
[bob@bob (master *=)]$
Bon soyons clair la modif dont on est en train de parler ne peut pas être commit telle quel. Pas question que les devs voient ça, c’est trop… fin, trop… précieux, c’est surtout trop tôt pour que des gros doigts boudinés de dev viennent détruire à jamais sa candide pureté 😉 Et là… it’s the drame, un des devs vient de pousser un truc… et il me dit qu’il arrive pour en parler… omagad omagad ! Qu’est-ce que je vais faire ? Je peux pas commit et il sera là avec moi derrière l’écran dans environ 5 secondes et pendant la discussion il va forcément y avoir un diff qui révélera mon code si secret… alors bon là c’est le moment ou je commence à transpirer, mon coeur s’emballe, mes mains deviennent moites et l’angoisse prend possession de mon frêle petit être… et… en fait c’est la fin, tout est terminé. Les ténèbres m’ont englouti et je suis à présent en train de dériver au dessus de mon corps inanimé, sans vie. Dur hein ?
Bon ! Si j’avais connu git stash l’histoire ne se serait pas terminée ainsi. En fait je n’aurais même pas scillé, 1) j’aurais tapé git stash dans mon shell et 2) à nouveau un git status pour voir ce que ça aurait donné.
[bob@bob (master *=)]$ git stash
# Saved working directory and index state WIP on master: b6e4b45 message du dernier commit
# HEAD is now at b6e4b45 message du dernier commit
[bob@bob (master *$=)]$ git status
# On branch master
# nothing to commit (working directory clean)
[bob@bob (master *$=)]$
Et tadaaa ! le fichier modifié n’est plus là. Mais il n’a pas du tout disparu, faisons un git stash list.
[bob@bob (master *$=)]$ git stash list
stash@{0}: WIP on master: b6e4b45 message du dernier commit
[bob@bob (master *$=)]$
La modif est dans ce truc bizarre là : stash@{0} et WIP ça veut dire Work In Progress. On pourrait même avoir plusieurs stash si on les cumulait. Ça donnerait ça :
[bob@bob (master *$=)]$ git stash list
stash@{0}: On master: et ainsi de suite
stash@{1}: On master: une autre modif top secrete
stash@{2}: WIP on master: b6e4b45 message du dernier commit
[bob@bob (master *$=)]$
On peut aussi se laisser un petit message si on veut, en tapant :
git stash save “mon super message bien pratique”
Ça permet d’y voir plus clair si par exemple on a beaucoup de modifs stashées.
Bon très bien et maintenant récupérons notre modif avec git stash pop pour continuer son secret développement 😉
[bob@bob (master *$=)]$ git stash pop
# On branch master
# Changes not staged for commit:
#
# modified: css/style.css
#
[bob@bob (master *=)]$
Par défaut git stash pop (ou git stash apply) vous récupérera le dernier stash en date (le plus récent pas le plus vieux). Et si on voulait en récupérer un particulièrement dans la liste ?
Eh bien là on devra faire un git stash pop leNomChelouAvecDes{} et comme c’est un nom imbitable vous pouvez utiliser la touche TAB pour démarrer l’autocompletion ça vous simplifier un peu la saisie.
Donc ça donnerait un truc comme ça :
[bob@bob (master *$=)]$ git stash pop stash@{2}
# On branch master
# Changes not staged for commit:
#
# modified: css/style.css
#
[bob@bob (master *$=)]$
Pas mal hein ?
Liste des principales commandes
git stash
# ou
git stash save "message"
(pour stasher les modifs en cours)
git stash -u
# ou
git stash save -u "message"
(pour stasher AUSSI les fichier non trackés, par défaut git stash ne les prends pas en compte)
git stash pop
# ou
git stash apply
(pour récupérer les dernière modifs stashées)
git stash pop stash@{2}
(pour récupérer un stash bien précis dans la liste)
git stash clear
(permet de supprimer toute la liste des stash)
git stash drop stash@{2}
(permet de supprimer un stash particulier dans la liste)
git stash show stash@{2}
(permet d’avoir plus d’infos sur le contenu d’un stash de la liste)
git stash -h
(pour afficher l’aide des commandes)
Conclusion
Git stash sert AVANT-TOUT à cacher rapidement du code qu’on veut garder secret 😀 Bon trêve de plaisanteries, vous l’aurez compris c’est bien pratique quand on veut rapidement faire le ménage dans un projet sans perdre les modifs en question.
Bon allez stashez bien ! Bande de stash…