Est-il possible de prévisualiser le contenu de la cachette dans git?


554

Je range souvent le travail pour plus tard, puis d'autres choses arrivent, et quelques semaines plus tard, je veux inspecter la cachette et savoir quels changements cela apporterait si je l'appliquais à l'arbre de travail dans son état actuel.

Je sais que je peux faire un diff git sur la stash, mais cela me montre toutes les différences entre l'arborescence de travail et la stash, alors que je suis juste intéressé de savoir ce que l'application de stash va changer.

Comment puis-je faire ceci?


1
sortie diff colorisée: git stash show -p stash@{1} >~/.diff && vim ~/.diff(ne doit pas être vim. n'importe quel éditeur de texte tant que votre éditeur de texte a un support de coloration syntaxique pour la diffsortie).
Trevor Boyd Smith

Réponses:


729

git stash showvous montrera les fichiers qui ont changé dans votre dernière cachette. Vous pouvez ajouter l' -poption pour afficher le diff.

git stash show -p

Si la cachette qui vous intéresse n'est pas la plus récente, ajoutez le nom de la cachette à la fin de la commande:

git stash show -p stash@{2}

Cela semble bon, et je le vois dans le manuel, mais quand j'essaye, cela me donne fatal: unable to create temp-file: Invalid argument- une idée pourquoi?
Benjol

29
Utilisez git stash show -p stash@{0}pour voir une cachette spécifique. 0 montre la dernière tonalité, 1 l'avant-dernière .. etc. git stash listaffichera tout le disponible.
brita_

6
Si vous utilisez PowerShell, vous devrez mettre le nom de la cachette entre guillemets. (ex: git stash show -p 'stash@{0}')
scott-pascoe


1
Si vous souhaitez enregistrer la différence dans l'utilisation des fichiersgit stash show -p stash@{0}> stash.txt
S_K

87

Pour afficher une liste actuelle de stash:

git stash list

Vous verrez une liste comme celle-ci:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

Pour afficher les différences sur l'un de ces stashes:

git stash show -p stash@{n}

34

Je suis un fan de gitkl'interface graphique de pour visualiser git repos. Vous pouvez afficher le dernier élément caché avec:

gitk stash

Vous pouvez également utiliser l'affichage de toutes vos modifications stockées (comme indiqué par git stash list). Par exemple:

gitk stash@{2}

Dans la capture d'écran ci-dessous, vous pouvez voir la cachette sous forme de validation dans le coin supérieur gauche, quand et d'où elle provient dans l'historique des validations, la liste des fichiers modifiés en bas à droite et la différence ligne par ligne dans le coin inférieur. -la gauche. Pendant que la cachette est toujours cachée.

gitk affichage d'une cachette


5
Vous pouvez fournir plusieurs stash@{X}valeurs sur la ligne de commande pour voir plus de résultats à la fois, mais je n'ai pas trouvé de moyen simple de simplement dire `` afficher toutes les entrées cachées '' dans gitk.
nobar

5
gitk stashsemble être un raccourci pourgitk stash@{0}
Leif Gruenwoldt

3
pour afficher toutes les cachettes dans gitk, vous pouvez utiliser gitk `git stash list --pretty=format:%gd`puis rechercher "WIP on" pour passer à la prochaine cachette.
Ikar Pohorský

2
gitk --reflogvous permet de voir toutes les cachettes, et plus encore.
nobar

1
gitk était le seul outil qui m'a montré directement que la cachette contenait des fichiers non suivis. Tous les autres m'ont juste montré "aucune différence".
Martin Bonner soutient Monica

22

Pour afficher toutes les modifications dans une cachette non remplie:

git stash show -p stash@{0}

Pour afficher les modifications d'un fichier particulier dans une cachette non éclatée:

git diff HEAD stash@{0} -- path/to/filename.php

dans le cas où l'on ne se souvient pas des noms de fichiers, cela fonctionne également pour tous les fichiers modifiés git diff HEAD stash @ {0}
Simeon

Juste pour plus de clarté: -pest l'abréviation de --patch. L'option vient de git-diff. Si vous préférez le formulaire long, vous pouvez écrire git stash show --patch.
Peterino

5

Au-delà de la recommandation gitk dans Est-il possible de prévisualiser le contenu caché dans git? vous pouvez installer tig et appeler tig stash. Ce programme de console gratuit / ouvert vous permet également de choisir la cachette à comparer


1
On dirait un outil parfait pour gérer plusieurs stashes! Vous pouvez également faire apparaître et déposer des masques avec les touches Pet !respectivement.
Ikar Pohorský

Les alternatives TUI sont toujours bonnes, mais pour les gens déjà habitués ou préférant d'une manière ou d'une autre, gitk il est relativement facile de le pirater pour afficher toutes les cachettes .
1737973


4

Lorsque cette question a été posée pour la première fois, cela n'était peut-être pas une option, mais, si vous utilisez PyCharm, vous pouvez utiliser l' UnStash Changesoutil (VCS-> Git-> UnStash Changes ...). Cela vous permet d'afficher la liste des modifications cachées, ainsi que de faire apparaître, supprimer, effacer ou appliquer (dans une nouvelle branche si vous le souhaitez):

Fenêtre Unstash Changes

et afficher les fichiers modifiés par stash:

Fenêtre Chemins affectés

ainsi que les différences par fichier. Dans les différences, vous pouvez sélectionner individuellement les modifications à appliquer à partir des modifications stockées dans la branche de travail (en utilisant le chevron pointant vers la gauche):

entrez la description de l'image ici


3

Vous pouvez afficher la liste de toutes les sauvegardes à l'aide de la commande suivante:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

La dernière cachette est la première.

Vous pouvez simplement sélectionner l'index nde la cachette fourni dans la liste ci-dessus et utiliser la commande suivante pour afficher les détails cachés

git stash show -p stash@{3}

De même,

git stash show -p stash@{n}

Vous pouvez également vérifier la différence en utilisant la commande:

git diff HEAD stash@{n} -- /path/to/file

3

oui la meilleure façon de voir ce qui est modifié est d'enregistrer dans un fichier comme ça:

git stash show -p stash@{0} > stash.txt

2

Tout d'abord, nous pouvons utiliser la liste de dissimulations git pour obtenir tous les éléments de dissimulation:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Ensuite, nous pouvons utiliser git stash show stash@{N}pour vérifier les fichiers sous une cachette spécifique N. Si nous le tirons, nous pouvons obtenir:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

La raison en est peut-être que la coquille mange des accolades bouclées et que Git voit stash@2et non stash@{2}. Et pour résoudre ce problème, nous devons utiliser des guillemets simples pour les accolades comme:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

Afficher la liste des modifications cachées

git stash list

Pour afficher la liste des fichiers modifiés dans une cachette particulière

git stash show -p stash@{0} --name-only

Pour afficher un fichier particulier dans la cachette

git show stash@{0} path/to/file

1

Afficher toutes les cachettes

Noms de fichiers uniquement:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Contenu complet du fichier dans toutes les réserves:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Vous obtiendrez une sortie diff colorisée que vous pourrez paginer avec space (en avant ) et b(en arrière ), et qpour fermer le téléavertisseur pour la cachette actuelle. Si vous préférez l'avoir dans un fichier, ajoutez-le > stashes.diffà la commande.


1

En plus des réponses existantes qui suggèrent d'utiliser (pour montrer la différence de l'avant-dernière cachette)

git stash show -p stash@{2}

Notez que dans la git-stashdocumentation , il est écrit que

Les stashes peuvent également être référencés en spécifiant uniquement l'index de stash (par exemple, l'entier nest équivalent à stash@{n}).

Par conséquent, il est également possible d'utiliser (cela équivaut à la commande ci-dessus)

git stash show -p 2

Ce qui devrait également éviter certains problèmes de Powershell .


1

J'aime comment gitkpeut vous montrer exactement ce qui n'était pas suivi ou assis dans l'index, mais par défaut, il affichera ces "validations" cachées au milieu de toutes vos autres validations sur la branche actuelle.

L'astuce consiste à exécuter gitk comme suit:

gitk "stash@{0}^!"

(La citation est là pour le faire fonctionner dans Powershell, mais de cette façon, elle devrait également fonctionner dans d'autres coquilles.)

Si vous recherchez cette syntaxe dans la page d'aide de gitrevisions, vous trouverez ce qui suit:

La r1^!notation inclut commit r1 mais exclut tous ses parents. En elle-même, cette notation dénote le commit unique r1 .

Cela mettra apparemment gitk dans un mode tel que seuls les parents immédiats du commit sélectionné sont affichés, ce qui est exactement ce que j'aime.


Si vous voulez aller plus loin et répertorier tous les stashes, vous pouvez exécuter ceci:

gitk `git stash list '--pretty=format:%gd^!'`

(Ces guillemets simples à l'intérieur des guillemets sont nécessaires pour apaiser Bash, sinon il se plaint du point d'exclamation)

Si vous utilisez Windows et utilisez cmd ou Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

La commande suivante peut être utilisée pour extraire à nouveau les différences de changement stocké dans tout autre stash ou commit ou branche ou HEAD.

git stash show
git show
git diff
git difftool

Voyons comment utiliser chacune des commandes mentionnées ci-dessus.

  1. git stash show

La commande simple git stash show donne un très bref résumé des changements de fichier, mais ne montrera pas la différence des changements par rapport à HEAD actuel.

  1. git show

La commande git-show est utilisée pour voir différents types d'objets.

La commande git-show n'est pas seulement utilisée pour visualiser les changements de stash, mais aussi pour voir un ou plusieurs objets comme des blobs, des arbres, des balises et des commits.

  1. git diff

La commande git-diff est également l'une des commandes courantes qui est utilisée pour afficher les changements entre les validations, la validation et l'arborescence de travail, etc.

Par défaut, git diff affichera le diff de la cachette sélectionnée par rapport à (fichiers modifiés) l'état actuel du référentiel à moins qu'une autre référence de cachette ou commit ne soit spécifié.

Pour obtenir la différence entre la plus haute cachette cachée @ {0} et la branche principale:

$ git diff stash @ {0} master

N'affiche que les noms de fichier et non les changements:

$ git diff - nom caché uniquement @ {0} maître

Voir la différence entre les stashes sélectionnés pour un fichier sélectionné:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. git difftool

La commande git-difftool peut également être utilisée pour trouver un diff entre la cachette sélectionnée et la validation ou la branche ou la cachette sélectionnée

Voyez la différence entre les deux derniers stashes:

$ git difftool stash @ {0} stash @ {0} ^ 1

git difftool --dir-diff stash @ {0} stash @ {0} ^ 1

Sommaire:

Commandes utiles pour extraire le diff de stash git stash show sélectionné, git show, git diff, git difftool.

Voir la différence en utilisant la commande git stash show,

git stash show -p stash @ {0}

Voir les changements dans la cachette en utilisant la commande git show,

git show stash @ {1}

Découvrez la différence entre la dernière sauvegarde et la validation sélectionnée à l'aide de la commande git diff,

git diff stash @ {0}

Références:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.