Question Comment extraire un fichier unique (ou les modifications apportées à un fichier) à partir d'un cache git?


Je voudrais savoir s'il est possible d'extraire un fichier unique ou un fichier d'un fichier git sans faire disparaître le changeset caché.

Est-ce que quelqu'un pourrait fournir des suggestions / idées à ce sujet?


550
2017-07-09 17:12


origine


Réponses:


Dans git cachette manpage vous pouvez lire cela (dans la section "Discussion", juste après la description "Options"):

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 à HEAD lorsque le    cachette a été créé.

Ainsi, vous pouvez traiter la réserve (par ex. stash@{0} est la première / la plus haute cachette) en tant que commit de fusion, et utilise:

$ git diff stash@{0}^1 stash@{0} -- <filename>

Explication: stash@{0}^1 raccourci désigne le premier parent d'une mémoire donnée, qui, comme indiqué dans l'explication ci-dessus, est un engagement auquel les modifications ont été cachées. Nous utilisons cette forme de "git diff" (avec deux commits) parce que stash@{0} / refs/stash est un commit de fusion, et nous devons dire à git quel parent nous voulons comparer. Plus cryptique:

$ git diff stash@{0}^! -- <filename>

devrait également fonctionner (voir git rev-parse manpage pour l'explication de rev^! syntaxe, dans la section "Specifying ranges").

De même, vous pouvez utiliser git caisse pour vérifier 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>

(Remarque ici <nom de fichier complet> est le chemin complet d'un fichier par rapport au répertoire supérieur d'un projet (pensez: par rapport à stash@{0})).


Vous pourriez avoir besoin de protéger stash@{0} à partir de l'expansion de la coque, c'est-à-dire "stash@{0}" ou 'stash@{0}'.


823
2017-07-09 18:21



Si tu utilises git stash apply plutôt que git stash pop, il appliquera la cachette à votre arbre de travail mais gardera toujours la cachette.

Avec cela fait, vous pouvez add/commit le fichier que vous souhaitez, puis réinitialisez les modifications restantes.


32
2017-07-09 17:58



Réponse courte

Pour voir l'ensemble du fichier: git show stash@{0}:<filename>

Pour voir le diff: git diff stash@{0}^1 stash@{0} -- <filename>


11
2017-12-22 13:05



Vous pouvez obtenir le diff pour une cachette avec "git show stash@{0}"(ou quel que soit le numéro du stash, voir" git stash list ") Il est facile d'extraire la section du diff pour un seul fichier.


9
2017-07-09 17:42



Il y a un moyen facile d'obtenir des changements de n'importe quelle branche, y compris des cachettes:

$ git checkout --patch stash@{0} path/to/file

Vous pouvez omettre la spécification de fichier si vous voulez patcher plusieurs parties. Ou omettre le correctif (mais pas le chemin) pour obtenir toutes les modifications apportées à un seul fichier. Remplacer 0 avec le numéro de cachette de git stash list, si vous en avez plus d'un. Notez que c'est comme diffet offre d'appliquer tout différences entre les branches. Pour obtenir des modifications à partir d'un seul commit / stash, jetez un oeil à git cherry-pick --no-commit.


8
2018-06-26 03:20



Le concept le plus simple à comprendre, bien que peut-être pas le meilleur, est que vous avez trois fichiers modifiés et que vous voulez stocker un fichier.

Si tu fais git stash pour les cacher 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 voulez décompresser ce fichier, exécutez un git reset --hard puis courir git stash apply encore une fois, en profitant du fait que git stash apply n'efface pas le diff de la pile de dissimulation.


5
2017-07-19 15:36



$ git checkout stash@{0} -- <filename>

Remarques:

  1. Assurez-vous mettre de l'espace après le "-" et le paramètre de nom de fichier

  2. Remplacez zéro (0) par votre numéro de cachette spécifique. Pour obtenir la liste de dissimulation, utilisez:

    git stash list
    

Basé sur La réponse de Jakub Narębski - Version plus courte


3
2017-09-08 05:53



Si les fichiers cachés doivent fusionner avec la version actuelle, utilisez les méthodes précédentes en utilisant diff. Sinon, vous pourriez utiliser git pop pour les décompacter, git add fileWantToKeep pour mettre en scène votre fichier, et faire un git stash save --keep-index, pour cacher tout 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 "saute" le fichier de la cachette. Les réponses précédentes le gardent git checkout stash@{0} -- <filename> donc ça va selon vos besoins.


1
2017-10-26 12:59