Git stash: "ne peut pas s'appliquer à un arbre sale de travail, s'il vous plaît mettre en scène vos changements"
j'essaie d'appliquer les changements que j'ai planqués plus tôt avec git stash pop
et obtenir le message:
Cannot apply to a dirty working tree, please stage your changes
une suggestion sur la façon de gérer cela?
11 réponses
quand je dois appliquer des modifications cachées à une copie de travail sale, par exemple pop Plus d'un ensemble de modifications de la cachette, j'utilise ce qui suit:
$ git stash show -p | git apply -3 && git stash drop
Fondamentalement, c'
- crée un patch
- pipes que pour la commande appliquer
- s'il y a des conflits, ils devront être résolus par une fusion à 3 voies
- si appliquer (ou fusionner) réussi il laisse tomber le juste appliqué cachette élément...
je me demande pourquoi il n'y a pas d'option -f
(force) pour git stash pop
qui devrait se comporter exactement comme la doublure ci-dessus.
en attendant, vous pourriez vouloir ajouter ce one-liner comme un alias git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
merci à @SamHasler pour avoir souligné le paramètre -3
qui permet de résoudre les conflits directement via une fusion à 3 voies.
je le fais de cette façon:
git add -A
git stash apply
et puis (optionaly):
git reset
vous pouvez le faire sans avoir à cacher vos changements actuels en exportant la cachette que vous voulez comme un fichier patch et en l'appliquant manuellement.
par exemple, dites que vous voulez appliquer stash@{0} à un arbre sale:
-
Exporter stash@{0} comme un correctif:
git stash show-P stash@{0} > Stash0.patch
-
appliquer manuellement les changements:
git appliquer Stash0.patch
si la deuxième étape échoue, vous devrez éditer la Stash0.fichier de patch pour corriger les erreurs et d'essayer ensuite de git appliquer à nouveau.
soit nettoyez votre répertoire de travail avec git reset, commit les modifications, ou, si vous voulez cacher les modifications en cours, essayez:
$ git stash save "description of current changes" $ git stash pop stash@{1}
cela va stocker les changements actuels, puis pop la deuxième cachette de la pile de stockage.
la solution de Mathias est certainement la plus proche d'un git stash pop --force (et vraiment, allez git devs, nous allons obtenir cette option déjà!)
Cependant, si vous voulez faire la même chose en utilisant uniquement des commandes git, vous pouvez:
- git commit -a-m "Fixme"
- git stash pop
- git commit-a -- amend
- git reset HEAD~
en autres les mots, faire un commit (qui ne sera jamais notre push) de vos modifications en cours. Maintenant que votre espace de travail est propre, ouvrez votre planque. Maintenant, commettez les changements de planque comme un amendement à votre précédent commit. Après avoir fait cela, vous avez maintenant les deux ensembles de changements combinés dans un seul commit ("Fixme"); réinitialisez simplement (--soft Pas --hard donc rien n'est réellement perdu) votre checkout à "un avant que commit", et maintenant vous avez les deux ensembles de changements, complètement non engagés.
**modifier* *
je viens de réaliser que c'est en fait encore plus facile; vous pouvez complètement sauter l'étape 3, donc ...
- git commit -a-m "Fixme"
- git stash pop
- git reset HEAD~
(Commettre les modifications en cours, pop off le planqué des changements, le reset que le premier s'engager à obtenir deux ensembles de modifications combinées dans un état non validée.)
aucune de ces réponses ne fonctionne vraiment si vous vous trouvez dans cette situation comme je l'ai fait aujourd'hui. Peu importe le nombre de git reset --hard
que j'ai fait, ça ne m'a mené nulle part. Ma réponse (non officielle par aucun moyen était):
- , Figure la cachette de hachage de l'utilisation
git reflog --all
- fusionnez ce hachage avec la branche qui vous intéresse
j'ai aussi trouvé la solution de Mathias Leppich pour bien fonctionner donc j'ai ajouté un alias pour lui à mon global .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
maintenant je peux juste taper
git apply-stash-to-dirty-working-tree
qui fonctionne très bien pour moi.
(votre kilométrage peut varier sur ce nom d'alias long. Mais j'aime une dose de verbosité quand il vient avec bash achèvement.)
vous pouvez appliquer une cachette à un arbre" sale "en faisant un git add
pour mettre en scène tous les changements que vous avez faits, nettoyant ainsi l'arbre. Ensuite vous pouvez git stash pop
et appliquer les modifications cachées, pas de problème.
vous avez des fichiers qui ont été modifiés mais non engagés. Soit:
git reset --hard HEAD (to bring everything back to HEAD)
ou, si vous voulez enregistrer vos modifications:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
j'ai eu le même problème mais git n'avait aucun fichier changé. S'avère que j'avais un index.verrouillez le fichier qui traînait. La suppression il a résolu le problème.
Je n'ai pas réussi à obtenir la plupart de ceux-ci à travailler; pour une raison quelconque, il pense toujours que j'ai des changements locaux à un dossier. Je ne peux pas appliquer une cachette, les correctifs ne s'appliquent pas, checkout
et reset --hard
échouent. Ce qui a finalement fonctionné a été de sauver la cachette comme une branche avec git stash branch tempbranchname
, puis de faire une fusion de branche normale: git checkout master
et git merge tempbranchname
.
De http://git-scm.com/book/en/Git-Tools-Stashing :
Si vous voulez un moyen plus facile pour tester les changements cachés à nouveau, vous pouvez lancer branche git stash, qui crée une nouvelle branche pour vous, vérifie la validation que vous étiez lorsque vous avez caché votre travail, réapplique votre travail là, et puis laisse tomber la cachette si elle s'applique avec succès