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?

128
demandé sur avernet 2009-09-01 09:47:56

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'

  1. crée un patch
  2. pipes que pour la commande appliquer
  3. s'il y a des conflits, ils devront être résolus par une fusion à 3 voies
  4. 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.

191
répondu muhqu 2014-07-29 06:41:22

je le fais de cette façon:

git add -A
git stash apply

et puis (optionaly):

git reset
49
répondu Sergii Mostovyi 2012-07-24 08:59:03

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:

  1. Exporter stash@{0} comme un correctif:

    git stash show-P stash@{0} > Stash0.patch

  2. 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.

9
répondu Ishan 2010-03-30 22:44:18

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.

8
répondu William Pursell 2009-09-01 06:04:24

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:

  1. git commit -a-m "Fixme"
  2. git stash pop
  3. git commit-a -- amend
  4. 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 ...

  1. git commit -a-m "Fixme"
  2. git stash pop
  3. 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.)

6
répondu machineghost 2012-04-17 18:17:36

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):

  1. , Figure la cachette de hachage de l'utilisation git reflog --all
  2. fusionnez ce hachage avec la branche qui vous intéresse
4
répondu Dan Rosenstark 2010-10-28 05:35:14

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.)

4
répondu mat 2017-05-23 12:26:17

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.

3
répondu Chris Vandevelde 2012-01-20 19:33:58

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
2
répondu brool 2009-09-01 05:54:01

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.

0
répondu boxed 2012-01-16 15:19:11

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

0
répondu rwilson04 2013-03-22 23:28:54