Comment supprimer une cachette créée avec git stash create?

549

Git stash semble faire beaucoup de ce que je veux, sauf qu'il est un peu difficile à scripter, car si vous n'avez pas de changements, il git stash; git stash popfera quelque chose de différent que si vous avez des changements dans votre référentiel.

Il semble que git stash create c'est la réponse à ce problème, et tout fonctionne, sauf une chose… Je ne peux pas me débarrasser de la cachette créée. Existe-t-il un moyen de se débarrasser de la cachette?

Pour être clair à 100% sur ce que je fais:

Créez la cachette:

~/tmp/a(master) $ git stash create 
60629375d0eb12348f9d31933dd348ad0f038435
~/tmp/a(master) $ git st
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#
~/tmp/a(master) $ git reset --hard
HEAD is now at 555d572 log message

Utilisez la cachette:

~/tmp/a(master) $ git apply 60629375d0eb12348f9d31933dd348ad0f038435
fatal: can't open patch '60629375d0eb12348f9d31933dd348ad0f038435': No such file or directory
~/tmp/a(master) $ git stash apply 60629375d0eb12348f9d31933dd348ad0f038435
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#

Supprimez la cachette: (sauf que ce dernier bit ne fonctionne pas)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Paul Wagland
la source
Malgré la distance dans le temps, je tiens à signaler aux autres voyageurs que l' git applyexécution dans la deuxième zone de code au moment de la rédaction de ce document n'a pas appliqué de correctif — le message d'erreur dans la sortie vous l'a dit. Donc, en fait, vous avez essayé de créer une cachette (qui n'a pas fonctionné, voir les commentaires ci-dessous) appliquer une cachette qui n'a pas été créée puis supprimer une cachette qui n'a pas été créée. C'est pourquoi rien de ce que vous avez fait n'a fonctionné.
Professeur Tom
1
@ProfessorTom la cachette a été créée, c'est pourquoi elle a renvoyé un code de hachage, et pourquoi cela git stash applya fonctionné. Les git applytentatives de lecture d'un fichier de correctif local, qui n'existe pas. Pour être honnête, cela ne devrait probablement pas être là, et cela n'aurait jamais pu fonctionner. Je suis vaguement tenté de le retirer de la question, mais étant donné qu'il a aidé tant de personnes dans sa forme actuelle, je vais la laisser telle quelle.
Paul Wagland

Réponses:

369

Pour supprimer un stash normal créé avec git stash, vous voulez git stash dropou git stash drop stash@{n}. Voir ci-dessous pour plus de détails.


Vous n'avez pas besoin de supprimer une cachette créée avec git stash create. De la documentation:

Créez une entrée de dissimulation (qui est un objet de validation normal) et renvoyez son nom d'objet, sans le stocker n'importe où dans l'espace de noms ref. Ceci est destiné à être utile pour les scripts. Ce n'est probablement pas la commande que vous souhaitez utiliser; voir "enregistrer" ci-dessus.

Étant donné que rien ne fait référence à la validation de la sauvegarde, il sera éventuellement récupéré.


Un stash créé avec git stashou git stash saveest enregistré dans refs/stashet peut être supprimé avec git stash drop. Comme avec tous les objets Git, le contenu réel de la cachette n'est pas supprimé de votre ordinateur jusqu'à ce qu'il gcélague ces objets après leur expiration (la valeur par défaut est 2 semaines plus tard).

Les anciens masques sont enregistrés dans le refs/stash reflog (essayez cat .git/logs/refs/stash) et peuvent être supprimés avec git stash drop stash@{n}, où nest le nombre indiqué par git stash list.

dahlbyk
la source
20
Cela ne répond pas à la question principale. En conséquence, des gens comme moi, qui arrivent à la question via Google à la recherche de la réponse à la question principale et ne se soucient pas particulièrement des détails réels, votent pour la personne qui y a réellement répondu. Certaines personnes votent également contre la réponse acceptée, car cela ne les aide pas. Personnellement, je viens de voter pour la réponse qui m'a aidé.
ArtOfWarfare
15
Donc: 1) Google "git delete stash" 2) cliquez sur le lien SO basé sur la première moitié du titre de la question 3) downvote la réponse correcte spécifique à la seconde moitié du titre. Voilà un nouveau.
dahlbyk
10
@ArtOfWarfare Ce serait alors un manque de compréhension en lecture, car il s'agit très clairement d'une réponse à la "question titulaire".
Chris Hayes
1
C'est suffisant. Je crée mes cachettes en utilisant simplement git stash- je ne sais pas si cela correspond réellement à git stash createquelque chose d'autre. Git est certainement quelque chose que j'apprends encore (si ce n'était pas le cas, je ne
lirais
1
@AdrianPronk C'est exactement le genre de chose que je recommanderais réellement d'utiliser git stash create. Plutôt que d'enregistrer dans un fichier de patch horodaté, vous pouvez simplement laisser git reflog l'enregistrer pour vous dans une référence personnalisée (par exemple refs/backup). Je voudrais essayer quelque chose comme 1) git stash create, 2) comparer l'arbre de la nouvelle cachette avec refs/backup^{tree}, 3) si l'arbre est différent git update-ref --create-reflog refs/backup <stash-sha>,. Finalement, les anciennes sauvegardes de sauvegarde seront élaguées automatiquement.
dahlbyk
838

git stash dropne prend aucun paramètre - qui supprime la cachette supérieure - ou une référence de cachette qui ressemble à: stash@{n}qui nnomme la cachette à supprimer. Vous ne pouvez pas transmettre un ID de validation à git stash drop.

git stash drop            # drop top hash, stash@{0}
git stash drop stash@{n}  # drop specific stash - see git stash list

La suppression d'une cachette changera lastash@{n} désignations de toutes les cachettes plus loin dans la pile.

Je ne sais pas pourquoi vous pensez que vous devez supprimer une stash, car si vous utilisez stash createune entrée de stash qui n'est pas créée pour votre "stash", il n'y a donc rien à supprimer.

CB Bailey
la source
Eh bien, l'entrée est créée en utilisant "stash" ... On pourrait logiquement penser qu'elle serait supprimée en utilisant "stash".
Paul Wagland
2
Regardez la page de manuel pour git stash. stash create ne crée pas d'entrée, seulement l'objet de validation pour la stash donc il n'y a aucune entrée dans le journal de stash à supprimer.
CB Bailey
3
De man : create Créez une stash (qui est un objet commit normal) et retournez son nom d'objet, sans le stocker n'importe où dans l'espace de noms ref.
ruffin
41
Attention : vous ne devriez probablement pas en supprimer plusieurs comme 1, 2, 3, car vous finirez par supprimer ce qui était à l'origine les numéros 1, 3 et 5. La bonne façon de supprimer 1, 2 et 3 serait de faites-les dans l'ordre 3, 2, 1 ou 1, 1, 1. De plus, c'est 0 indexé, 0 étant en haut de la pile.
ArtOfWarfare
2
Git Extensions émet une commande inconnue lorsque le bouton "Stash Changes" est enfoncé, et quoi qu'il fasse persiste lors de la fermeture et du redémarrage de l'application. Il n'y a aucun moyen évident de se débarrasser de la cachette à l'aide de l'interface graphique, mais à partir de la ligne de commande "git stash list" montre la cachette WIP, et "git stash clear" s'en débarrasse.
Dave
215

Si vous êtes sûr à 100% que vous n'avez qu'une seule cachette ou si vous souhaitez supprimer toutes les cachettes (assurez- git stash listvous que 107% est sûr), vous pouvez faire:

git stash clear

..et oubliez-les (il supprime toutes les réserves).

Remarque: Ajout de cette réponse pour ceux qui se sont retrouvés ici à la recherche d'un moyen de les effacer tous (comme moi).

Felipe Pereira
la source
26
Si vous n'avez qu'une seule cachette, je recommanderais toujours d'utiliser git stash drop, car cela ne laisse tomber qu'une seule cachette, et vous n'avez pas à vous soucier de perdre plus que prévu.
Paul Wagland
Surévalué car il répond réellement à la question, qu'il soit ou non recommandé de le faire. J'en ai vraiment besoin, car les réserves que j'ai créées aujourd'hui doivent disparaître.
Alex McCabe
2
J'utilise stash depuis longtemps maintenant. Cette fois, cependant, je n'ai pas pu me débarrasser de la dernière cachette que j'ai faite en utilisant simplement git stash dropcomme d'habitude. Je ne suis pas sûr de ce que j'ai fait différemment. Quoi qu'il en soit, a git stash cleartravaillé pour moi. Je ne savais pas que ça existait. +1
Konstantinos Gaitanis
3
+1 parce que git refusait de supprimer le stash, car l'un des fichiers créés par le stash existait déjà maintenant.
Thiago Barcala
12
plus précisément, à 107%.
levininja
84

Depuis git doc: http://git-scm.com/docs/git-stash

drop [-q | --quiet] []

Supprimez un seul état caché de la liste de cachettes. Si non est donné, il supprime le dernier. c'est à direstash@{0} , doit être une référence de journal de dissimulation valide de la forme stash @ {}.

exemple:

git stash drop stash@{5}

Cela supprimerait l'entrée de cachette 5. Pour voir toute la liste des cachettes:

git stash list
Jorge
la source
4
Sauf que je dis explicitement au bas de la question que git stash drop ne fait pas ce que je veux.
Paul Wagland
1
Je recommanderais de vérifier le contenu d'une cachette en utilisant - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}avant de l'exécuter git stash drop. Croyez-moi, cela vous évitera bien des ennuis :)
realPK
71

Vous devriez utiliser

git stash save

et pas

git stash create

car cela crée une cachette (qui est un objet de validation normal) et renvoie son nom d'objet, sans le stocker n'importe où dans l'espace de noms ref. Par conséquent, ne sera pas accessible avec stash apply.

Utilisation git stash save "some comment" est utilisé lorsque vous avez des modifications non mises en scène que vous souhaitez répliquer / déplacer sur une autre branche

Utilisation git stash apply stash@{0} (en supposant que votre index de sauvegarde enregistré est 0) lorsque vous souhaitez que vos modifications enregistrées (stockées) se reflètent sur votre branche actuelle

vous pouvez toujours utiliser git stash list pour vérifier tous vos index cachés

et utilisez git stash drop stash@{0}(en supposant que votre index de stash enregistré est 0 et que vous souhaitez le supprimer) pour supprimer un stash particulier.

Shalom Sam
la source
3
Juste pour information - La simple saisie de la commande par git stashdéfaut estgit stash save
RBT
1
git stash createest destiné à être utilisé par des scripts. C'est le cas d'utilisation d'OP. Donc, recommander git stash savepeut être utile pour des utilisations "normales", mais pas pour le cas d'utilisation d'OP. OP voudra peut-être jeter un œil aux documents : il y a plus de commandes liées aux scripts, par exemplegit stash store
Adrian W
1
git stash save "message"de nos jours devrait lire git stash push -m "message". Comparergit commit -m "message"
Tino
2

Ça marche aussi

git stash drop <index>

comme

git stash drop 5
MonTea
la source
1

Le document est ici (en chinois) veuillez cliquer.

vous pouvez utiliser

git stash list

git stash drop stash @ {0}

entrez la description de l'image ici

Longalei
la source
git stash createest différent de git stash save, en particulier, le formulaire de création n'apparaît pas dans la liste et ne peut pas être supprimé, d'où la question.
Paul Wagland
@PaulWagland Merci de votre réponse et fournissez la réponse. Honnêtement, je ne trouve pas le "git stash create" dans le document officiel. Mais à ce sujet, ça m'intéresse. Si vous voulez trouver le "git stash create" dans la "git stash list". vous pouvez le faire ci-dessus.
Longalei
0
git stash           // create stash,
git stash push -m "message" // create stash with msg,
git stash apply         // to apply stash,
git stash apply indexno // to apply  specific stash, 
git stash list          //list stash,
git stash drop indexno      //to delete stash,
git stash pop indexno,
stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code
Bilal Yaqoob
la source