J'ai caché mes changements. Maintenant, je veux décompresser seulement certains fichiers de la stash. Comment puis-je faire ceci?
J'ai caché mes changements. Maintenant, je veux décompresser seulement certains fichiers de la stash. Comment puis-je faire ceci?
Réponses:
Comme mentionné ci-dessous , et détaillé dans " Comment extraire un seul fichier (ou des modifications apportées à un fichier) d'une git stash? ", Vous pouvez appliquer l'utilisation git checkout
ou git show
restaurer un fichier spécifique.
git checkout stash@{0} -- <filename>
Cela écrase filename
: assurez-vous que vous n'avez pas apporté de modifications locales, ou que vous souhaitiez peut-être fusionner le fichier caché à la place .
(Comme commenté par Jaime M. , pour certains shell comme tcsh où vous devez échapper aux caractères spéciaux, la syntaxe serait: git checkout 'stash@{0}' -- <filename>
)
ou pour l'enregistrer sous un autre nom de fichier:
git show stash@{0}:<full filename> > <newfile>
(notez que voici
<full filename>
le chemin complet d'un fichier par rapport au répertoire supérieur 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 au moment où le stash a été effectué - il n'applique PAS (juste) les changements stashés pour ce fichier.
Pour faire ce dernier:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(comme commenté par peterflynn , vous pourriez avoir besoin | git apply -p1
dans certains cas, la suppression d' un ( p1
) barre oblique de chemins diff traditionnels)
Comme commenté: "unstash" ( git stash pop
), puis:
git add
)git stash --keep-index
Le dernier point est ce qui vous permet de conserver certains fichiers tout en en cachant d'autres.
Il est illustré dans " Comment cacher un seul fichier parmi plusieurs fichiers qui ont été modifiés ".
git stash pop
raison de conflits de fichiers. La réponse de Balamurugan A a fait l'affaire pour moi dans ce cas.
unstash
signifie pop
, comme il me semble que ce serait probablement le cas dans la plupart des cas, cela ne répond que partiellement à la question. Comment supprimez-vous ensuite les pièces appliquées de manière sélective de la cachette afin d'éviter des conflits ultérieurs et / ou de la confusion lors du saut des modifications restantes?
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
-a
drapeau que j'avais utilisé lors de la création de la cachette.
Je pense que la réponse de VonC est probablement ce que vous voulez, mais voici un moyen de faire un "git apply" sélectif:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
rien.
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 spécialement les accolades, et sc
cela est nécessaire car l' >
opérateur de PS par défaut est 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.
Liste d'abord 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'
Ensuite, montrez quels fichiers sont dans la cachette (permet de choisir la cachette 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 aimez:
git checkout stash@{1} -- <filename>
ou dossier entier:
git checkout stash@{1} /errors
Il fonctionne également sans --
mais il est recommandé de les utiliser. Voir cet article.
Il est également classique de reconnaître un double tiret comme un signal pour arrêter l'interprétation des options et de traiter littéralement tous les arguments suivants.
git stash pop
généré une erreur pour les fichiers non suivis. Merci.
Si vous git stash pop
(sans conflits), il supprimera la cachette après son application. Mais si vous git stash apply
appliquez le correctif sans le supprimer de la liste cachée. Ensuite, vous pouvez annuler les modifications indésirables avecgit checkout -- files...
git stash pop
et il y a des conflits, vous devrez les corriger manuellement et la cachette ne sera PAS supprimée.
Encore une façon:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
ou show
écrasera aveuglément votre fichier au lieu d'appliquer simplement des modifications. "Une autre façon" est un euphémisme.
path/to/file2
comme vous voulez faire la différence avec le même fichier dans votre espace de travail. Laisser de côté le deuxième chemin me convient parfaitement. - Et je reçois un message d'erreur en utilisant l' -R
option ("appliquer le patch à l'envers", en essayant de patcher la version cachée?!). Donc, ma version de travail ressemble git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Pour les utilisateurs de Windows: les accolades ont une signification particulière dans PowerShell. Vous pouvez soit entourer de guillemets simples ou échapper avec backtick. Par exemple:
git checkout 'stash@{0}' YourFile
Sans cela, vous pouvez recevoir une erreur:
Unknown switch 'e'