Le problème
Nous avons souvent l’habitude d’utiliser stash
simplement en faisant un git stash
, pour mettre de côté de façon temporaire ses modifications, puis un peu plus tard, git stash pop
, pour réappliquer celles-ci. Mais comment faire dans le cas où on ne veut remiser qu’un seul fichier ? La documentation de git nous dit que git stash
équivaut en fait à git stash push
.
La solution
Nous allons simplement passer quelques arguments à cette option :
git stash push -p -m "Mon beau message"
-p
(ou --patch
en version longue) permet de "Sélectionner interactivement les sections" à remiser. -m
permet de spécifier un message, ce qui est quand même plus sympa pour s’y retrouver.
Une fois la commande exécutée, vous aller devoir sélectionner comment traiter pour chaque hunk (morceau). Si vous voulez afficher l’aide, presser ?
puis entrée, vous obtiendrez l’aide :
y - stash this hunk
n - do not stash this hunk
q - quit; do not stash this hunk or any of the remaining ones
a - stash this hunk and all later hunks in the file
d - do not stash this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
e - manually edit the current hunk
? - print help
Soit en français avec quelques commentaires en plus :
y - remiser ce morceau
n - ne pas remiser ce morceau
q - quitter; ne pas remiser ce morceau et aucun de ceux qui reste
a - remiser ce morceau et tout ceux qui reste du fichier actuel
d - ne pas remiser ce morceau et aucun de ceux restant du fichier actuel
g - sélectionner un morceau où aller
/ - chercher un morceau correspondant correspondant à l'expression régulière que vous aller passer
j - laisser ce morceau pour le moment et décider plus tard, aller au prochain morceau qui n'a pas été traité
J - laisser ce morceau pour le moment et décider plus tard, aller au prochain morceau
e - éditer manuellement le morceau
? - afficher l'aide
a
et d
sont intéressant si vous voulez effectuer un traitement plus rapide, fichier par fichier, au lieu de traiter morceau de fichier par morceau de fichier. Par exemple, si vous n’avez qu’un seul fichier que vous voulez remiser, utiliser d
jusqu’à temps de tomber sur le bon fichier, puis utiliser a
et enfin q
pour quitter et sauvegarder.
Pour aller plus loin
Je vous partage quelques options qui me sont utile.
-k
ou --keep-index
qui permet de ne pas remiser ce que vous avez en zone de staging (c’est-à-dire prêt à être commit). Vous pouvez aussi choisir de les remiser avec l’option --no-keep-index
.
-u
ou --include-untracked
permettant de remiser les fichiers non suivis, ce que ne fait pas par défaut stash
show
pour afficher le contenu d’un remisage. Sans option, affiche les différences, de façon résumée, du dernier remisage. Pour voir les différences de façon détaillée, utiliser l’option -p
. Pour voir l’avant-dernier, git stash show stash@{1}
.
Garder à l’esprit que le remise est une pile de type FILO, qui signifie "First In, Last Out" ou en français, "Premier dedans, dernier sorti". C’est comme une pile d’assiette, vous allez toujours prendre les dernières rangées.
Pour en savoir plus, vous pouvez aller lire la documentation officielle se trouvant ici : https://git-scm.com/docs/git-stash/fr
Conclusion
Cette façon de faire n’est pas forcément la plus user friendly, mais elle vous permet de comprendre mieux comment fonctionne git, cet outil si puissant et si méconnu. Je vous invite à apprendre à l’utiliser en ligne de commande avant d’utiliser des outils graphique comme PHPStorm ou Sublime Merge. Cela vous permettra de mieux comprendre ce que vous êtes en train de faire et de ne plus avoir peur de faire quoi que ce soit 😉