Je cache mes changements. Maintenant, je veux cacher seulement certains fichiers de la réserve. Comment puis-je faire ceci?
Comme mentionné ci-dessous , et détaillé dans " Comment puis-je extraire un seul fichier (ou les modifications d’un fichier) à partir d’une cachette Git? ", vous pouvez appliquer l’utilisation git checkout
ou git show
pour restaurer un fichier spécifique.
_git checkout stash@{0} -- <filename>
_
Cela écrase filename
: assurez-vous de ne pas avoir de modifications locales, ou vous voudrez peut-être fusionner le fichier stashed file) à la place .
(Comme commenté par Jaime M. , pour certains Shell comme tcsh où vous devez échapper les caractères spéciaux, la syntaxe serait la suivante: _git checkout 'stash@{0}' -- <filename>
_)
ou pour le sauvegarder sous un autre nom de fichier:
_git show stash@{0}:<full filename> > <newfile>
_
(notez qu'ici _
<full filename>
_ est le chemin complet d'un fichier par rapport au répertoire principal d'un projet (pensez: par rapport à _stash@{0}
_)).
yucer suggère dans les commentaires :
Si vous souhaitez sélectionner manuellement les modifications que vous souhaitez appliquer à partir de ce fichier:
_git difftool stash@{0}..HEAD -- <filename>
_
Vivek ajoute dans les commentaires :
On dirait que "_
git checkout stash@{0} -- <filename>
_" restaure la version du fichier à partir du moment où le stash a été effectué - il ne fait que NOT applique (uniquement) les modifications stockées pour ce fichier.
Pour faire ce dernier:
_git diff stash@{0}^1 stash@{0} -- <filename> | git apply
_
(comme commenté par peterflynn , vous aurez peut-être besoin de _| git apply -p1
_ dans certains cas, en supprimant un (_p1
_) barre oblique des chemins diff traditionnels)
Comme commenté: "unstash" (_git stash pop
_), puis:
git add
_)git stash --keep-index
_Le dernier point concerne ce qui vous permet de conserver un fichier tout en en conservant d’autres.
Il est illustré dans " Comment ne cacher qu'un seul fichier parmi plusieurs fichiers ayant été modifiés ".
git checkout stash@{N} <File(s)/Folder(s) path>
Par exemple. Pour restaurer uniquement le fichier ./test.c et le dossier ./include à partir du dernier fichier caché,
git checkout stash@{0} ./test.c ./include
Je pense que la réponse de VonC correspond probablement à ce que vous voulez, mais voici une façon de faire une "application géniale" sélective:
git show stash@{0}:MyFile.txt > MyFile.txt
Première liste de toutes les cachettes
git stash list
↓
stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'
Puis montrez quels fichiers se trouvent dans la réserve (prenons la réserve 1):
git stash show 1 --name-only
//Hint: you can also write
//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} -- <filename>
ou dossier entier:
git checkout stash@{1} /errors
Cela fonctionne aussi sans --
mais il est recommandé de les utiliser. Voir this post.
Il est également classique de reconnaître un double trait d'union comme un signal permettant d'arrêter l'interprétation des options et de traiter tous les arguments suivants à la lettre.
Si vous git stash pop
(sans conflit), il supprimera le stash après son application. Mais si vous git stash apply
, il appliquera le correctif sans le supprimer de la liste de dissimulation. Ensuite, vous pouvez annuler les modifications indésirables avec git checkout -- files...
Une autre façon:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
Pour les utilisateurs de Windows: les accolades ont une signification particulière dans PowerShell. Vous pouvez entourer avec des guillemets simples ou échapper avec backtick. Par exemple:
git checkout 'stash@{0}' YourFile
Sans cela, vous pourriez recevoir une erreur:
Unknown switch 'e'