531 votes

Comment décompacter uniquement certains fichiers?

J'ai mis de côté mes modifications. Maintenant, je veux enlever seulement certains fichiers de la réserve. Comment puis-je faire cela?

4 votes

Je pense que vous devez appliquer l'ensemble du stash, mais ensuite vous pouvez re-stash sélectivement.

0 votes

Dans vos futurs développements, essayez d'éviter de mettre en réserve les fichiers, commitez-les plutôt, car git stash n'est pas recommandé.

5 votes

@AbdouTahiri Qu'y a-t-il de mal avec la cache?

639voto

VonC Points 414372

Tel que mentionné ci-dessous, et détaillé dans "Comment extraire un fichier unique (ou des modifications à un fichier) d'une stash git?", vous pouvez utiliser git checkout ou git show pour restaurer un fichier spécifique.

git checkout stash@{0} -- 

Avec Git 2.23+ (août 2019), utilisez git restore, qui remplace la commande git checkout confuse:

git restore --source=stash@{0} -- 

Cela écrase filename: assurez-vous de ne pas avoir de modifications locales, ou vous voudrez peut-être fusionner le fichier caché au lieu.

(Comme commenté par Jaime M., pour certains shells comme tcsh où vous devez échapper les caractères spéciaux, la syntaxe serait: git checkout 'stash@{0}' -- )

ou pour le sauvegarder sous un autre nom de fichier:

git show stash@{0}:  >  

(notez qu'ici est le chemin complet d'un fichier relatif au répertoire racine d'un projet (pensez: relatif à stash@{0})).

yucer suggère dans les commentaires:

Si vous souhaitez sélectionner manuellement les changements que vous souhaitez appliquer à partir de ce fichier:

git difftool stash@{0}..HEAD -- 
# ou
git checkout -p stash@{0} -- 

Vivek ajoute dans les commentaires:

On dirait que "git checkout stash@{0} -- " restaure la version du fichier telle qu'elle était au moment de la réalisation de la stash - il n'applique PAS (juste) les changements cachés pour ce fichier.
Pour faire cela:

git diff stash@{0}^1 stash@{0} --  | git apply

(comme commenté par peterflynn, vous pourriez avoir besoin de | git apply -p1 dans certains cas, en enlevant un slash initial (p1) des chemins de diff traditionnels)


Comme commenté: "unstash" (git stash pop), puis:

  • ajoutez ce que vous voulez conserver à l'index (git add)
  • mettez le reste en cachette: git stash --keep-index

Le dernier point est ce qui vous permet de conserver certains fichiers tout en mettant d'autres en cache.
C'est illustré dans "Comment cacher uniquement un fichier parmi plusieurs fichiers modifiés".

5 votes

Cela ne fonctionne pas si vous ne pouvez pas git stash pop en raison de conflits de fichiers. La réponse de Balamurugan A a fait l'affaire pour moi dans ce cas.

1 votes

Si vous souhaitez sélectionner manuellement les modifications que vous souhaitez appliquer à partir de ce fichier, vous pouvez utiliser git difftool stash@{0}..HEAD --

0 votes

@yucer Bien. J'ai inclus votre commentaire dans la réponse pour plus de visibilité.

128voto

Balamurugan A Points 172
git checkout stash@{N} 

Par exemple, Pour restaurer seulement le fichier ./test.c et le dossier ./include du dernier stash,

git checkout stash@{0} ./test.c ./include

13 votes

Ceci est la bonne réponse! Commande en ligne unique pour n'appliquer que les modifications mises en mémoire tampon de fichiers spécifiques, fonctionne à merveille!

2 votes

Pour appliquer simplement les modifications mises en réserve pour le fichier: "git diff stash@{N}^ 1 stash@{N} -- | git apply"

0 votes

Cela fonctionne aussi pour moi. Il suffit de vérifier sélectivement les fichiers nécessaires à utiliser depuis le stash et vous avez fini. J'étais bloqué dans cela car j'avais utilisé le drapeau -a lors de la création du stash.

45voto

Black Points 3971

Tout d'abord, listez toutes les caches

git stash list

stash@{0}: WIP sur Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP sur Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP sur master : 7e450c81 Fusion de la branche 'Offlineseite'

Ensuite, montrez quels fichiers sont dans la cache (choisissons la cache 1):

git stash show 1 --name-only

//Astuce : vous pouvez aussi écrire
//git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

Ensuite, appliquez le fichier que vous souhaitez :

git checkout stash@{1} -- 

ou tout un dossier :

git checkout stash@{1} /errors

Ça marche aussi sans -- mais il est recommandé de les utiliser. Voir ce post.

Il est également conventionnel de reconnaître un double tiret comme un signal pour arrêter l'interprétation des options et traiter tous les arguments suivants littéralement.

40voto

Mike Monkiewicz Points 907

Je pense que la réponse de VonC est probablement ce que vous voulez, mais voici une façon de faire un "git apply" sélectif :

git show stash@{0}:MyFile.txt > MyFile.txt

4 votes

Cela pourrait être ce que vous voulez dans certains cas, mais méfiez-vous que cette commande va écraser plutôt que fusionner avec toutes les modifications du répertoire de travail.

0 votes

Cela fonctionne pour moi, car je voulais simplement copier un fichier qui n'existe que dans le stash et je n'avais pas besoin de checkout quoi que ce soit.

1 votes

Pour Windows PowerShell: git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt - les backticks sont nécessaires pour que PS n'interprète pas les accolades spécialement, et le sc est nécessaire parce que l'opérateur > ​​de PS par défaut à UTF-16 (en fait UCS-2) ce qui n'est probablement pas ce que vous voulez. La réponse de @Balamurugan A ne souffre pas de ces problèmes.

18voto

Lacho Tomov Points 319

Une autre façon :

git diff stash@{N}^! -- chemin/vers/fichier1 chemin/vers/fichier2  | git apply -R

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X