J'ai sauté une cachette et il y a eu un conflit de fusion. Contrairement à la question qui est répertoriée comme un doublon, j'avais déjà quelques modifications non validées dans le répertoire que je voulais conserver. Je ne veux pas seulement faire disparaître le conflit de fusion, mais aussi ramener mon répertoire à l'état où il était avant la pop.
J'ai essayé git merge --abort
, mais git a affirmé qu'aucune fusion n'était en cours. Existe-t-il un moyen facile d'interrompre un pop sans détruire les modifications que j'avais à l'origine dans le répertoire?
git stash pop
sur un répertoire de travail impur. Dans ce cas, vous pouvez simplementgit reset --hard
et votre réserve est toujours intacte. (C'est plus ou moins ce que suggère le sujet lié de @ BradKoch)Réponses:
Ok, je pense que j'ai travaillé sur "git stash inapply". C'est plus complexe que
git apply --reverse
parce que vous avez besoin d'une action de fusion inverse au cas où une fusion aurait été effectuée par legit stash apply
.La fusion inverse nécessite que toutes les modifications en cours soient insérées dans l'index:
git add -u
Inversez ensuite ce
merge-recursive
qui a été fait pargit stash apply
:git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Maintenant, il ne vous restera plus que les modifications non cachées. Ils seront dans l'index. Vous pouvez utiliser
git reset
pour mettre en scène vos modifications si vous le souhaitez.Étant donné que votre original a
git stash apply
échoué, je suppose que l'inverse pourrait également échouer car certaines des choses qu'il souhaite annuler n'ont pas été effectuées.Voici un exemple montrant comment la copie de travail (via
git status
) se retrouve à nouveau propre:la source
git stash apply
ne laisse jamais de cachette, et lorsqu'une fusion échoue, ellegit stash pop
conserve également la cachetteMon cas d'utilisation: j'ai juste essayé de sauter sur la mauvaise branche et j'ai eu des conflits. Tout ce dont j'ai besoin, c'est d'annuler la pop mais de la conserver dans la liste cachée pour que je puisse la sortir sur la bonne branche. J'ai fait ça:
Facile.
la source
stash pop
entrer. Cela ressemble à une recette pour un désastre.Edit: De la
git help stash
documentation dans la section pop:L'application de l'État peut échouer avec des conflits; dans ce cas, il n'est pas supprimé de la liste cachée. Vous devez résoudre les conflits à la main et appeler manuellement git stash drop par la suite.
Si l'option --index est utilisée, essaie de rétablir non seulement les modifications de l'arbre de travail, mais aussi celles de l'index. Cependant, cela peut échouer lorsque vous avez des conflits (qui sont stockés dans l'index, où vous ne pouvez donc plus appliquer les modifications telles qu'elles étaient à l'origine).
Essayez de copier en dur tous vos dépôts dans un nouveau répertoire (pour en avoir une copie) et exécutez:
git stash show
et enregistrez cette sortie quelque part si vous vous en souciez.puis:
git stash drop
pour supprimer la cachette en conflit puis:git reset HEAD
Cela devrait laisser votre dépôt dans l'état où il était auparavant (j'espère que je n'ai toujours pas pu reprocher votre problème)
===
J'essaie de reprocher votre problème mais tout ce que j'obtiens quand usin
git stash pop
est:Dans un dir propre:
Je ne vois pas git essayer de fusionner mes modifications, cela échoue. Avez-vous des étapes de repro que nous pouvons suivre pour vous aider?
la source
J'ai toujours utilisé
git reset --merge
Je ne me souviens pas qu'il ait jamais échoué.
la source
git reset
. Savez-vous s'il est fonctionnellement identique àgit reset --merge
?Si vous n'avez pas à vous soucier des autres modifications que vous avez apportées et que vous souhaitez simplement revenir au dernier commit, vous pouvez faire:
la source
OK, je pense que j'ai réussi à trouver un workflow qui vous ramènera là où vous devez être (comme si vous n'aviez pas fait le pop).
FAITES UNE SAUVEGARDE AVANT LA MAIN !! Je ne sais pas si cela fonctionnera pour vous, alors copiez l'intégralité de votre repo au cas où cela ne fonctionnerait pas.
1) Corrigez les problèmes de fusion et corrigez tous les conflits en sélectionnant toutes les modifications qui proviennent du correctif (dans tortoisemerge, cela apparaît comme un. REMOETE (le leur)).
2) Validez ces modifications (elles seront déjà ajoutées via la commande mergetool). Donnez-lui un message de validation de «fusion» ou quelque chose dont vous vous souvenez.
3) Maintenant, vous aurez toujours vos modifications locales non mises en scène que vous avez commencées à l'origine, avec un nouveau commit du patch (nous pouvons nous en débarrasser plus tard). Maintenant, validez vos modifications non programmées
4) Inversez le patch. Cela peut être fait avec la commande suivante:
5) Validez ces modifications:
6) Débarrassez-vous des commits patch / unpatch
à partir de là, supprimez les deux lignes contenant «fusionner» et «patch inversé».
7) Récupérez vos modifications intangibles et annulez la validation des «modifications locales»
Je l'ai parcouru avec un exemple simple et il vous ramène là où vous voulez être - directement avant que la cachette ne soit sautée, avec vos modifications locales et avec la cachette toujours disponible pour la pop.
la source
git stash show -p | git apply -R
cela ne fonctionne pas si lagit stash apply
fusion est réelle. Voir ma réponse ...J'ai résolu cela d'une manière quelque peu différente. Voici ce qui s'est passé.
Tout d'abord, j'ai sauté sur la mauvaise branche et j'ai eu des conflits. La cachette est restée intacte mais l'index était en résolution de conflit, bloquant de nombreuses commandes.
Un simple
git reset HEAD
avorta la résolution du conflit et laissa les changements non validés (et INATTENDUS ).Plusieurs ont
git co <filename>
ramené l'index à son état initial. Enfin, j'ai changé de branche avecgit co <branch-name>
et exécuté une nouvellegit stash pop
, qui s'est résolue sans conflits.la source
Quelques idées:
Utilisez
git mergetool
pour diviser les fichiers de fusion en parties originales et nouvelles. Espérons que l'un d'eux est le fichier avec vos modifications non cachées.Appliquez le diff de la cachette à l'envers, pour annuler uniquement ces modifications. Vous devrez probablement diviser manuellement les fichiers avec les conflits de fusion (ce qui, espérons-le, fonctionnera ci-dessus).
Je n'ai testé ni l'un ni l'autre, donc je ne suis pas sûr qu'ils fonctionneront.
la source
Je pourrais reproduire
git stash pop
le répertoire clean sur "dirty", avec des modifications non validées, mais pas encore pop qui génère un conflit de fusion.Si lors d'un conflit de fusion, la cachette que vous avez essayé d'appliquer n'a pas disparu, vous pouvez essayer d'examiner
git show stash@{0}
(éventuellement avec--ours
ou--theirs
) et de comparer avecgit statis
etgit diff HEAD
. Vous devriez être en mesure de voir les modifications apportées par l'application d'une stash.la source
Si DavidG a raison de ne pas avoir caché la cachette à cause du conflit de fusion, il vous suffit de nettoyer votre répertoire de travail.
git commit
Tout ce dont vous vous souciez rapidement . (Vous pouvez le fairereset
ousquash
le valider plus tard si vous n'avez pas terminé.) Ensuite, avec tout ce qui vous tient à cœur,git reset
tout le reste qui estgit stash pop
vidé dans votre répertoire de travail.la source
S'il n'y a eu aucun changement par étapes avant le
git stash pop
, comme dans la question, les deux commandes suivantes devraient fonctionner.La première annule toutes les fusions de la cachette, réussies ou non. La seconde supprime tous les fichiers non suivis introduits par la cachette.
De
man git stash
:The working directory must match the index.
ce que souligne @DavidG, lestash pop
échouera si des fichiers modifiés actuellement non mis en conflit entrent en conflit. En tant que tel, nous ne devrions pas avoir à nous soucier de dénouer les conflits de fusion au-delà du retourHEAD
. Les fichiers modifiés restants ne sont alors pas liés à la cachette et ont été modifiés avant lastash pop
S'il y a eu des changements par étapes, je ne sais pas si nous pouvons compter sur les mêmes commandes et vous voudrez peut-être essayer la technique de @Ben Jackson. Suggestions appréciées ..
Voici une configuration de test pour tous les différents cas https://gist.github.com/here/4f3af6dafdb4ca15e804
la source
Utilisez
git reflog
pour répertorier toutes les modifications apportées à votre historique git. Copiez un ID d'action et tapezgit reset ACTION_ID
la source
Je poste ici en espérant que d'autres trouveront ma réponse utile. J'ai eu un problème similaire lorsque j'ai essayé de faire un pop stash sur une branche différente de celle à partir de laquelle j'avais stashé. Dans mon cas, je n'avais pas de fichiers non validés ou dans l'index mais toujours dans le cas des conflits de fusion (même cas que @pid). Comme d'autres l'ont souligné précédemment, le pop git stash a échoué a effectivement conservé ma stash, puis un rapide git reset HEAD plus revenir à ma branche d'origine et faire la stash à partir de là a résolu mon problème.
la source