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 legit 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 legit stash pop
ferait.Si vous utilisez
git stash apply
plutôt quegit 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.la source
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:
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 degit stash list
, si vous en avez plusieurs. Notez que cela ressemblediff
, 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
.la source
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 diree
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 fairegit applydiffat stash@{4}
n'utilise que des fichiers qui ont changé entre la cachette et son parent.Réponse courte
Pour voir l'intégralité du fichier:
git show stash@{0}:<filename>
Pour voir le diff:
git diff stash@{0}^1 stash@{0} -- <filename>
la source
diff
pardifftool
pour utiliser votre diff externe préféré.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:
D' après la réponse de Jakub Narębski - Version plus courte
la source
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.la source
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 avecgit 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 puisgit 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 quegit stash apply
la différence de la pile de stash n'est pas effacée.la source
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 ungit 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 conserventgit checkout stash@{0} -- <filename>
pour qu'il se déroule selon vos besoins.la source
Utilisez ce qui suit pour appliquer les modifications à un fichier dans une cachette à votre arborescence de travail.
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.la source
Utiliser l' extension Git Stash dans Visual Studio Code
la source