web-dev-qa-db-fra.com

Git diff contre une cachette

Comment puis-je voir les changements apportés par le stockage à l'arbre de travail actuel? J'aimerais savoir quels changements seront apportés avant de les appliquer!

1077
Arcabard

Voir la dernière cachette:

git stash show -p

Voir une cachette arbitraire:

git stash show -p stash@{1}

Dans les pages de manuel git stash:

Par défaut, la commande affiche le diffstat, mais elle acceptera tout format connu de git diff (par exemple, git stash show -p stash @ {1} pour afficher le deuxième stash le plus récent sous forme de patch).

1515
Amber

Pour voir la cachette la plus récente:

git stash show -p

Pour voir une cachette arbitraire:

git stash show -p stash@{1}

De plus, j'utilise git diff pour comparer le stock avec n'importe quelle branche.

Vous pouvez utiliser:

git diff stash@{0} master

Pour voir toutes les modifications par rapport au maître de branche .


Ou vous pouvez utiliser:

git diff --name-only stash@{0} master

Pour trouver facilement que les noms de fichiers modifiés.

264
czerasz

Si la branche sur laquelle vos modifications stockées sont basées a changé entre-temps, cette commande peut être utile:

git diff stash@{0}^!

Ceci compare la réserve avec le commit sur lequel elle est basée.

82
t.heintz

Si votre arbre de travail est sale , vous pouvez le comparer à une réserve en validant d'abord l'arbre de travail sale, puis en le comparant à la réserve. Ensuite, vous pouvez annuler la validation avec l’arbre de travail modifié (car vous ne souhaitez peut-être pas inclure cette validation dans votre journal de validation).

Vous pouvez également utiliser l'approche suivante pour comparer deux stash l'un avec l'autre (dans ce cas, il suffit de faire apparaître l'un des stash en premier).

  • Commettez votre arbre de travail sale:

    git add .
    git commit -m "Dirty commit"
    
  • Diffère la réserve avec ce commit:

    git diff HEAD stash@{0}
    
  • Ensuite, vous pouvez annuler le commit et le remettre dans le répertoire de travail:

    git reset --soft HEAD~1
    git reset .
    

Maintenant, vous avez différencié l’arbre de travail sale avec votre réserve, et vous êtes revenu à votre position initiale. 

34
Magne

Cela fonctionne pour moi sur la version 1.8.5.2 de git:

git diff stash HEAD
18
Rimian

@ Magne's answer est la seule date à (très tardive) à répondre à l'interprétation la plus souple/utile de la question, mais elle est un peu plus compliquée que nécessaire. Plutôt que de valider et de réinitialiser, stockez simplement votre copie de travail, comparez-le, puis extrayez-le.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

Cela vous montre les différences entre le haut de la pile de stash et votre dossier de travail en faisant temporairement modifier les modifications apportées au dossier de travail en haut de la pile de stash (stash @ {0}). ) puis comparez en utilisant le haut d'origine dans la position «nouvel ensemble» afin de voir les changements qui résulteraient de son application au-dessus de votre travail actuel.

"Mais que se passe-t-il si je n'ai pas de travail en cours?" Ensuite, vous êtes dans le cas ennuyeux normal. Il suffit d'utiliser la réponse de @ Amber

git stash show

ou la réponse de @ czerasz

git diff stash@{0}

ou admettre que le stockage et le stockage sont rapides et faciles de toute façon, détachez simplement les modifications et inspectez-les. Si vous ne les voulez pas pour le moment, jetez-les (les modifications d'index/dossier de travail en cours). En complet c'est

git stash apply
git diff
git reset
git checkout
18
SensorSmith

Si vous avez des outils pour diff (comme au-delà de la comparaison)

git difftool stash HEAD
9
yerlilbilgin

FWIWCeci peut être un peu redondant pour toutes les autres réponses et est très similaire à la réponse acceptée qui est sur place; mais peut-être que ça va aider quelqu'un. 

git stash show --help vous donnera tout ce dont vous avez besoin; y compris les informations sur les spectacles cachés.

afficher [<stash>]

Affichez les modifications enregistrées dans la cachette sous forme de différence entre l'état caché et son parent d'origine. Quand non est donné, montre le dernier. Par défaut, la commande affiche le diffstat, mais elle accepte tout format connu de git diff (par exemple, git stash show -p stash @ {1} pour afficher la seconde stash la plus récente sous forme de correctif). Vous pouvez utiliser les variables de configuration stash.showStat et/ou stash.showPatch pour modifier le comportement par défaut.

2
Anovative

Une façon de faire cela sans rien bouger est de tirer parti du fait que patch peut lire les diff de git (diffs unifiées)

git stash show -p | patch -p1 --verbose --dry-run

Cela vous montrera un aperçu pas à pas de ce que le patch ferait normalement. L'avantage supplémentaire de ceci est que patch ne s'empêchera pas de l'écrire dans l'arborescence de travail non plus, si pour une raison quelconque vous avez vraiment besoin que Git se taise sur la validation avant modification, allez-y et supprimez --dry- courir et suivre les instructions verbeuses.

1
xenithorb

En combinant ce que j'ai appris dans ce fil et dans celui-ci , lorsque je veux voir "ce qu'il y a dans la réserve", je lance d'abord:

git stash show stash@{0}

Cela montrera quels fichiers ont été modifiés. Ensuite, pour obtenir un diff visuel Nice dans un difftool, je fais:

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

Cela affichera toutes les différences à la fois de la réserve donnée contre son parent.

Vous pouvez configurer l’outil diff dans ~/.gitconfig, par exemple. avec fusion :

...
[diff]
    tool = meld
1
Ferrard

Juste au cas où, pour comparer un fichier dans l’arbre de travail et dans la cachette, utilisez la commande ci-dessous.

git diff stash{0} -- fileName (with path)
0
Pramod B R

Elle la liste de stash

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

Alors récupérez le numéro de la cachette et faites:

Tu peux faire:

 git stash show -p stash@{1}

Mais si vous voulez un diff (c'est différent de montrer la cachette, c'est pourquoi j'écris cette réponse.Diff considère le code actuel dans votre branche et show montre simplement ce que vous allez appliquer )

Vous pouvez utiliser:

git diff stash@{0}

ou 

git diff stash@{0} <branch name>

Une autre chose intéressante à faire est:

git stash apply
git stash apply stash@{10}

Ceci applique le stash sans le retirer de la liste, vous pouvez git checkout . pour supprimer ces modifications ou si vous êtes heureux git stash drop stash@{10} pour supprimer un stash de la liste.

A partir de là, je ne recommande jamais d'utiliser git stash pop et d'utiliser une combinaison de git stash apply et git stash drop Si vous appliquez une réserve dans la mauvaise branche ... il est parfois difficile de récupérer votre code.

0
Raúl Martín