Comment puis-je extraire un seul fichier (ou des modifications à un fichier) à partir d'un git stash?
j'aimerais savoir s'il est possible d'extraire un seul fichier ou une diff d'un fichier d'une cachette sans enlever le jeu de changement de cachette.
est-ce que quelqu'un pourrait fournir quelques suggestions/idées à ce sujet?
8 réponses
Dans git stash page de manuel, vous pouvez lire que (dans la section "Discussion", juste après "Options" description):
une cachette est représentée comme un commit dont l'arbre enregistre l'état du répertoire de travail, et son premier parent est le commit en tête lorsque le cachette a été créé.
pour que vous puissiez traiter stash (par exemple stash@{0}
est la première stash / stash supérieure) comme une fusion s'engager, et d'utilisation:
$ git diff stash@{0}^1 stash@{0} -- <filename>
explication: stash@{0}^1
raccourci signifie premier parent de la cachette donnée, qui comme indiqué dans l'explication ci-dessus est commit à laquelle les changements ont été planqués. Nous utilisons cette forme de" diff de git "(avec deux commits) parce que stash@{0}
/ refs/stash
est une commit de fusion, et nous devons dire à git contre quel parent nous voulons faire une diff. Plus énigmatique:
$ git diff stash@{0}^! -- <filename>
devrait également fonctionner (voir git rev-parse manpage pour une explication de la syntaxe rev^!
, dans la section "Spécifier des plages").
de même, vous pouvez utiliser git checkout pour vérifier un seul fichier de la cachette:
$ git checkout stash@{0} -- <filename>
ou pour le sauvegarder sous un autre nom de fichier:
$ git show stash@{0}:<full filename> > <newfile>
ou
$ git show stash@{0}:./<relative filename> > <newfile>
( note que ici stash@{0}
)).
vous pourriez avoir besoin de protéger stash@{0}
de l'expansion de la coque, C.-à-d. utiliser "stash@{0}"
ou 'stash@{0}'
.
Si vous utilisez git stash apply
plutôt que git stash pop
, il appliquera la cachette de votre arbre de travail, mais encore conserver la cachette.
avec ceci fait, vous pouvez add
/ commit
le fichier que vous voulez et puis Réinitialiser les changements restants.
réponse Courte
pour voir le dossier complet: git show stash@{0}:<filename>
pour voir la différence: git diff stash@{0}^1 stash@{0} -- <filename>
vous pouvez obtenir la diff pour une cachette avec " git show stash@{0}
"(ou quel que soit le numéro de la cachette est; voir"git stash list"). Il est facile d'extraire la section de la diff pour un seul fichier.
il y a un moyen facile d'obtenir des changements à partir de n'importe quelle branche, y compris les cachettes:
$ git checkout --patch stash@{0} path/to/file
vous pouvez omettre le fichier spec si vous voulez corriger de nombreuses parties. Ou omettez patch (mais pas le chemin) pour obtenir toutes les modifications à un seul fichier. Remplacer 0
par le numéro de stash de git stash list
, si vous en avez plusieurs. Notez que c'est comme diff
, et offre d'appliquer tous différences entre les branches. Pour obtenir des changements à partir de seulement un seul commit/cachette, consultez git cherry-pick --no-commit
.
le concept le plus simple à comprendre, bien que peut-être pas le meilleur, est que vous avez trois fichiers changés et vous voulez stocker un fichier.
si vous faites git stash
pour les cacher tous, git stash apply
pour les rapporter à nouveau et puis git checkout f.c
sur le fichier en question pour le réinitialiser efficacement.
quand vous voulez décompresser ce fichier, lancez un git reset --hard
puis lancez à nouveau git stash apply
, en profitant du fait que git stash apply
ne nettoie la différence de la pile de cachettes.
$ git checkout stash@{0} -- <filename>
Notes:
-
assurez-vous que vous mettez l'espace après le " -- " et le nom du fichier paramètre
-
remplacer zéro (0) par votre numéro de stash spécifique. Pour obtenir stash list, utilisez:
git stash list
basé sur la réponse de Jakub Narębski -- version plus courte
si les fichiers cachés doivent fusionner avec la version actuelle, alors utilisez les méthodes précédentes en utilisant diff. Sinon, vous pourriez utiliser git pop
pour les détacher, git add fileWantToKeep
pour mettre en scène votre fichier, et faire un git stash save --keep-index
, pour tout cacher sauf ce qui est sur scène.
Rappelez-vous que la différence de cette façon avec les précédentes est qu'elle "s'affiche" le fichier stash. Les réponses précédentes le gardent git checkout stash@{0} -- <filename>
donc il va selon vos besoins.