Réponses:
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 apply
n'appliquera pas les modifications cachées si vous avez une copie de travail sale. Vous pouvez donc voir git 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:
git add -A
git stash apply
puis (facultatif):
git reset
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.
Nettoyez votre répertoire de travail avec git reset, validez les modifications ou, si vous voulez cacher les modifications actuelles, essayez:
$ git stash save "description des changements actuels" $ git stash pop stash @ {1}
Cela cachera les modifications actuelles, puis sortira la deuxième réserve de la pile de réserves.
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é.)
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
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
[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
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.)
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 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 validés. Soit:
git reset --hard HEAD (to bring everything back to HEAD)
ou, si vous souhaitez enregistrer vos modifications:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
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
et reset --hard
échoueront. Ce qui a finalement fonctionné a été de sauvegarder la réserve en tant que branche avec git stash branch tempbranchname
, puis de faire une fusion de branche normale: git checkout master
et git merge tempbranchname
. Depuis http://git-scm.com/book/en/Git-Tools-Stashing :
Si vous voulez un moyen plus simple de tester à nouveau les modifications cachées, vous pouvez exécuter git stash branch, qui crée une nouvelle branche pour vous, vérifie le commit sur lequel vous étiez lorsque vous avez caché votre travail, réapplique votre travail là-bas, puis supprime le cacher s'il s'applique avec succès
git stash show -p | git apply
différent degit stash apply
?