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?

572
demandé sur PlagueHammer 2009-07-09 21:12:11

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 est le nom du chemin complet d'un fichier relatif pour couronner le répertoire d'un projet (pense: par rapport à 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}' .

853
répondu Jakub Narębski 2016-08-24 10:50:56

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.

32
répondu Tim Henigan 2009-07-09 17:58:37

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>

13
répondu Luboš Turek 2015-12-22 13:05:13

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.

9
répondu Nathan Kitchen 2009-07-09 17:42:45

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 .

8
répondu Walf 2017-06-26 03:20:58

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.

5
répondu Philluminati 2010-07-19 15:36:40
$ git checkout stash@{0} -- <filename>

Notes:

  1. assurez-vous que vous mettez l'espace après le " -- " et le nom du fichier paramètre

  2. 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

4
répondu Rama 2018-01-29 04:51:49

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.

1
répondu Hola Soy Edu Feliz Navidad 2017-10-26 13:07:37