Réponses:
Sur la page de manuel de git stash, vous pouvez lire (dans la section "Discussion", juste après la description de "Options") que:
Un stash est représenté comme un commit dont l'arborescence enregistre l'état du répertoire de travail, et son premier parent est le commit chez HEAD lorsque le stash a été créé.
Vous pouvez donc traiter la stash (par exemple, la stash@{0}
première / la plus haute) comme un commit de fusion, et utiliser:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Explication: stash@{0}^1
signifie le premier parent de la cachette donnée, qui, comme indiqué dans l'explication ci-dessus, est la validation à laquelle les modifications ont été cachées. Nous utilisons cette forme de "git diff" (avec deux commits) car stash@{0}
/ refs/stash
est un commit de fusion, et nous devons dire à git contre quel parent nous voulons faire la différence. Plus cryptique:
$ git diff stash@{0}^! -- <filename>
devrait également fonctionner (voir la page de manuel git rev-parse pour l'explication de la rev^!
syntaxe, dans la section "Spécification des plages").
De même, vous pouvez utiliser git checkout pour extraire un seul fichier de la cachette:
$ git checkout stash@{0} -- <filename>
ou pour l'enregistrer sous un autre nom de fichier:
$ git show stash@{0}:<full filename> > <newfile>
ou
$ git show stash@{0}:./<relative filename> > <newfile>
( notez qu'ici <nom de fichier complet> est le chemin d'accès complet d'un fichier par rapport au répertoire supérieur d'un projet (pensez: par rapport à stash@{0}
)).
Vous devrez peut-être vous protéger stash@{0}
de l'expansion du shell, c'est-à-dire utiliser "stash@{0}"
ou 'stash@{0}'
.
git checkout
la page de manuel de. Il ne peut pas déposer le fichier dans un autre emplacement. Il y a une référence à cela dans: stackoverflow.com/questions/888414/…
git checkout
approche copie le fichier exact de la cachette - elle ne le fusionne pas avec ce qui se trouve dans votre répertoire de travail comme le git stash apply
ferait. (Donc, si vous avez des modifications par rapport à la base sur laquelle la réserve a été créée, elles seront perdues).
git stash apply
fusionner les modifications dans un fichier qui a été modifié dans l'arborescence de travail depuis que le fichier a été stocké, ce fichier dans l'arborescence de travail doit être transféré. Pour que la fusion automatique fonctionne, les mêmes fichiers ne peuvent pas être modifiés à la fois dans la copie de travail et dans la copie stockée à fusionner. Enfin, l'application de cachette ne supprime pas l'élément de la cachette comme le git stash pop
ferait.
Si vous utilisez git stash apply
plutôt que git stash pop
, il appliquera la cachette à votre arbre de travail mais gardera toujours la cachette.
Cela fait, vous pouvez add
/ commit
le fichier que vous souhaitez, puis réinitialisez les modifications restantes.
git stash pop stash@{0}
(liste des changements planqué: git stash list
)
Il existe un moyen facile d'obtenir des modifications à partir de n'importe quelle branche, y compris les stashes:
$ git checkout --patch stash@{0} path/to/file
Vous pouvez omettre la spécification de fichier si vous souhaitez corriger en plusieurs parties. Ou omettez le correctif (mais pas le chemin d'accès) pour obtenir toutes les modifications dans un seul fichier. Remplacez-le 0
par le numéro de réserve de git stash list
, si vous en avez plusieurs. Notez que cela ressemble diff
, et propose d'appliquer toutes les différences entre les branches. Pour obtenir des modifications à partir d'un seul commit / stash, jetez un œil à git cherry-pick --no-commit
.
git help checkout
. --patch
fait une fusion interactive, il applique tout morceau que vous approuvez dans le shell (ou tout ce que vous enregistrez si vous choisissez de dire e
le patch). Le chemin seul écrasera le fichier, comme je l'ai écrit, "toutes les modifications".
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- alors faire git applydiffat stash@{4}
n'utilise que des fichiers qui ont changé entre la cachette et son parent.
Pour voir l'intégralité du fichier: git show stash@{0}:<filename>
Pour voir le diff: git diff stash@{0}^1 stash@{0} -- <filename>
diff
par difftool
pour utiliser votre diff externe préféré.
$ git checkout stash@{0} -- <filename>
Remarques:
Assurez-vous de mettre de l'espace après le "-" et le paramètre de nom de fichier
Remplacez zéro (0) par votre numéro de réserve spécifique. Pour obtenir la liste de dissimulation, utilisez:
git stash list
D' après la réponse de Jakub Narębski - Version plus courte
Vous pouvez obtenir le diff pour une cachette avec " git show stash@{0}
" (ou quel que soit le numéro de la cachette; voir "git stash list"). Il est facile d'extraire la section du diff pour un seul fichier.
git show stash
pour afficher la cachette la plus haute (normalement la seule que vous ayez). De même, vous pouvez afficher la différence entre votre branche actuelle et la cachette avec git diff head stash
.
Le concept le plus simple à comprendre, même s'il n'est peut-être pas le meilleur, est que vous avez modifié trois fichiers et que vous souhaitez en cacher un.
Si vous faites git stash
pour les ranger tous, git stash apply
pour les ramener à nouveau puis git checkout f.c
sur le fichier en question pour le réinitialiser efficacement.
Lorsque vous souhaitez décompresser ce fichier, exécutez-le git reset --hard
, puis exécutez-le à git stash apply
nouveau, en profitant du fait que git stash apply
la différence de la pile de stash n'est pas effacée.
Si les fichiers cachés doivent fusionner avec la version actuelle, utilisez les méthodes précédentes en utilisant diff. Sinon, vous pouvez utiliser git pop
pour les décompresser, git add fileWantToKeep
pour organiser votre fichier, et faire un git stash save --keep-index
, pour tout ranger sauf ce qui est sur scène. N'oubliez pas que la différence de cette façon avec les précédentes est qu'elle "fait sortir" le fichier de la cachette. Les réponses précédentes le conservent git checkout stash@{0} -- <filename>
pour qu'il se déroule selon vos besoins.
Utilisez ce qui suit pour appliquer les modifications à un fichier dans une cachette à votre arborescence de travail.
git diff stash^! -- <filename> | git apply
C'est généralement mieux que d'utiliser git checkout
car vous ne perdrez pas les modifications que vous avez apportées au fichier depuis que vous avez créé la cachette.
Utiliser l' extension Git Stash dans Visual Studio Code