J'essaie d'appliquer les modifications que j'ai cachées précédemment git stash pop
et de recevoir le message:
Cannot apply to a dirty working tree, please stage your changes
Une suggestion sur la façon de gérer cela?
Lorsque je dois appliquer des modifications cachées à une copie de travail sale, par exemple faire sortir plus d'un changesets de la réserve, j'utilise ce qui suit:
$ git stash show -p | git apply -3 && git stash drop
Fondamentalement, il
Je me demande pourquoi il n'y a pas d' -f
option (force) pour git stash pop
laquelle devrait se comporter exactement comme le one-liner ci-dessus.
En attendant, vous voudrez peut-être ajouter ce one-liner en tant qu'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 signalé le -3
paramètre qui permet de résoudre les conflits directement via la fusion à 3 voies.
git stash show -p | git apply
différent degit stash apply
?git stash apply
n'appliquera pas les modifications cachées si vous avez une copie de travail sale. Vous pouvez donc voirgit stash show -p | git apply
qu'une sorte de réserve forcée s'applique.error: <file> does not match index
pour chaque fichier modifié. Cependant, une autre solution a fonctionné.Je le fais de cette manière:
puis (facultatif):
la source
git add -u
, ce qui est comme-A
sauf qu'il n'ajoute pas de fichiers non suivis.Vous pouvez le faire sans avoir à cacher vos modifications actuelles en exportant la réserve que vous souhaitez sous forme de fichier de correctif et en l'appliquant manuellement.
Par exemple, supposons que vous souhaitiez appliquer stash @ {0} à un arbre sale:
Exportez le stash @ {0} en tant que correctif:
git stash show -p stash @ {0}> Stash0.patch
Appliquez manuellement les modifications:
git apply Stash0.patch
Si la deuxième étape échoue, vous devrez éditer le fichier Stash0.patch pour corriger les erreurs, puis réessayer git apply.
la source
Nettoyez votre répertoire de travail avec git reset, validez les modifications ou, si vous voulez cacher les modifications actuelles, essayez:
Cela cachera les modifications actuelles, puis sortira la deuxième réserve de la pile de réserves.
la source
La solution de Mathias est certainement la plus proche d'un git stash pop --force (et vraiment, allez les développeurs Git, obtenons déjà cette option!)
Cependant, si vous souhaitez faire la même chose en utilisant uniquement des commandes git, vous pouvez:
En d'autres termes, faites un commit (que nous ne pousserons jamais) de vos changements actuels. Maintenant que votre espace de travail est propre, ouvrez votre réserve. Maintenant, validez les changements de stash comme un amendement à votre commit précédent. Cela fait, vous avez maintenant les deux ensembles de changements combinés en un seul commit ("Fixme"); il suffit de réinitialiser (--soft PAS --hard donc rien n'est réellement perdu) votre checkout à "un avant cette validation", et maintenant vous avez les deux ensembles de changements, complètement non validés.
** MODIFIER * *
Je viens de réaliser que c'est encore plus facile; vous pouvez ignorer complètement l'étape 3, donc ...
(Validez les modifications actuelles, supprimez les modifications cachées, réinitialisez cette première validation pour obtenir les deux ensembles de modifications combinés dans un état non validé.)
la source
Aucune de ces réponses ne fonctionne réellement si vous vous trouvez dans cette situation comme je l'ai fait aujourd'hui. Peu importe combien
git reset --hard
j'ai fait, cela ne m'a mené nulle part. Ma réponse (pas officielle du tout était):git reflog --all
la source
J'ai également trouvé que la solution de Mathias Leppich fonctionnait très bien, j'ai donc ajouté un alias pour cela à mon .gitconfig global
Maintenant je peux juste taper
ce qui fonctionne très bien pour moi.
(Votre kilométrage peut varier sur ce long nom d'alias. Mais j'aime une dose de verbosité quand il s'agit de terminer bash.)
la source
Vous pouvez appliquer une réserve à un arbre "sale" en effectuant un
git add
pour mettre en scène toutes les modifications que vous avez apportées, nettoyant ainsi l'arbre. Ensuite, vous pouvezgit stash pop
et appliquer les modifications cachées, pas de problème.la source
Vous avez des fichiers qui ont été modifiés mais non validés. Soit:
ou, si vous souhaitez enregistrer vos modifications:
la source
J'ai eu le même problème mais git n'avait aucun fichier modifié. Il s'avère que j'avais un fichier index.lock qui traînait. Le supprimer a résolu le problème.
la source
J'ai été incapable de faire fonctionner la plupart de ces derniers; pour une raison quelconque, il pense toujours que j'ai des modifications locales dans un fichier. Je ne peux pas appliquer de réserve, les correctifs ne s'appliqueront pas
checkout
etreset --hard
échoueront. Ce qui a finalement fonctionné a été de sauvegarder la réserve en tant que branche avecgit stash branch tempbranchname
, puis de faire une fusion de branche normale:git checkout master
etgit merge tempbranchname
. Depuis http://git-scm.com/book/en/Git-Tools-Stashing :la source