141 votes

Git stash : « ne peut s’appliquer à un arbre de travail sale, s’il vous plaît en scène vos modifications »

Je suis en train d’appliquer des modifications j’ai planqué plus tôt avec `` et faire passer le message :

Toute suggestion sur la manière de faire face à cela ?

207voto

muhqu Points 2828

Quand je dois appliquer planqué les modifications apportées à une sale copie de travail, p. ex. une fenêtre plus d'un ensemble de modifications de la cachette, j'utilise le suivant:

$ git stash show -p | git apply -3 && git stash drop

Fondamentalement, il

  1. crée un patch
  2. les tuyaux de la commande appliquer
  3. s'il y a des conflits doivent être résolus par le 3-way merge
  4. si d'appliquer (ou de fusion), a réussi, il descend de la juste appliqué la planque de l'article...

Je me demande pourquoi il n'y a pas d' -f (force) option pour git stash pop qui devrait se comportent exactement comme le one-liner au-dessus.

En attendant, vous pouvez ajouter ce one-liner comme un git alias:

$ git config --global --replace-all alias.unstash \
   '!git stash show -p | git apply -3 && git stash drop'
$ git unstash

Grâce à @SamHasler pour souligner l' -3 paramètre qui permet de résoudre les conflits directement via 3-voie de fusion.

64voto

sergey_mo Points 232

Je le fais de cette façon :

et puis (optionnellement) :

9voto

Ishan Points 867

Vous pouvez le faire sans avoir à ranger les modifications apportées par l'exportation de la cachette que vous voulez comme un fichier de correctif manuellement et en l'appliquant.

Par exemple, disons que vous souhaitez appliquer stash@{0} pour un sale arbre:

  1. L'exportation stash@{0} comme un patch:

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

  2. Appliquer manuellement les modifications:

    git appliquer Stash0.patch

Si la deuxième étape échoue, vous devrez modifier le Stash0.fichier de patch pour corriger les erreurs et d'essayer ensuite de git appliquer à nouveau.

8voto

William Pursell Points 56211

Nettoyer votre répertoire de travail avec git reset, valider les modifications ou, si vous voulez planquer les changements en cours, essayez :

 stash git $ économisez « description des changements en cours » $ git stash pop stash@{1} 

Ceci planquer les changements actuels et pop puis la deuxième cachette de la pile de la cachette.

6voto

machineghost Points 9864

Mathias la solution est certainement la plus proche d'un git stash pop --force (et vraiment, allez Git devs, let's get cette option déjà!)

Toutefois, 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 d'autres termes, faire un commit (qui ne sera jamais notre push) de vos modifications en cours. Maintenant que votre espace de travail est propre, pop de votre cachette. Maintenant, engager la cachette des changements comme une modification à votre précédente livraison. Ayant fait cela, vous avez maintenant les deux ensembles de modifications combinées dans un seul commit ("Fixme"); il suffit de le réinitialiser (--soft PAS --difficile, donc rien n'est perdu) de passer à la caisse "avant que la commettre", et maintenant vous avez deux ensembles de modifications, complètement non validées.

**EDIT**

Je viens de réaliser, c'est même plus facile, vous pouvez passer directement à 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.)

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