Wie lösche ich einen mit git stash create erstellten Stash?

549

Git Stash scheint viel von dem zu tun, was ich will, außer dass es ein wenig schwierig ist, Skripte zu erstellen. Wenn Sie keine Änderungen haben, git stash; git stash popwird dies etwas anderes tun, als wenn Sie Änderungen in Ihrem Repository haben.

Es scheint, dass dies git stash createdie Antwort auf dieses Problem ist, und alles funktioniert, bis auf eine Sache… Ich kann den erstellten Vorrat nicht loswerden. Gibt es eine Möglichkeit, das Versteck loszuwerden?

Um 100% klar zu machen, was ich tue:

Erstellen Sie das Versteck:

~/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

Verwenden Sie das Versteck:

~/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
#

Löschen Sie den Stash: (außer dass dieses letzte Bit nicht funktioniert)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Paul Wagland
quelle
Trotz der zeitlichen Entfernung möchte ich Mitreisenden darauf hinweisen, dass der git applyLauf im zweiten Codefeld zum Zeitpunkt dieses Schreibens keinen Patch angewendet hat - die Fehlermeldung in der Ausgabe hat Ihnen dies mitgeteilt. Sie haben also versucht, einen Stash zu erstellen (was nicht funktioniert hat, siehe Kommentare unten). Wenden Sie einen Stash an, der nicht erstellt wurde, und löschen Sie dann einen Stash, der nicht erstellt wurde. Deshalb haben Sie nichts getan.
Professor Tom
1
@ProfessorTom der Stash wurde erstellt, aus diesem Grund wurde ein Hash-Code zurückgegeben und der git stash applyhat funktioniert. Die git applyVersuche, eine lokale Patch-Datei zu lesen, die nicht vorhanden ist. Um ehrlich zu sein, sollte es wahrscheinlich nicht da sein und es hätte nie funktionieren können. Ich bin vage versucht, es aus der Frage zu entfernen, aber da es in seiner jetzigen Form so vielen geholfen hat, werde ich es so lassen, wie es ist.
Paul Wagland

Antworten:

368

Um einen normalen Vorrat zu löschen, der mit erstellt wurde git stash, möchten Sie git stash dropoder git stash drop stash@{n}. Siehe unten für weitere Details.


Sie müssen keinen mit erstellten Stash löschen git stash create. Aus den Dokumenten:

Erstellen Sie einen Stash-Eintrag (bei dem es sich um ein reguläres Commit-Objekt handelt) und geben Sie seinen Objektnamen zurück, ohne ihn irgendwo im ref-Namespace zu speichern. Dies soll für Skripte nützlich sein. Es ist wahrscheinlich nicht der Befehl, den Sie verwenden möchten. siehe "Speichern" oben.

Da nichts auf das Stash-Commit verweist, wird irgendwann Müll gesammelt.


Ein mit git stashoder erstellter Stash git stash savewird gespeichert refs/stashund kann mit gelöscht werden git stash drop. Wie bei allen Git-Objekten wird der eigentliche Stash-Inhalt erst dann von Ihrem Computer gelöscht, wenn gcdiese Objekte nach Ablauf gelöscht werden (Standard ist 2 Wochen später).

Ältere Stashes werden im refs/stash Reflog gespeichert (try cat .git/logs/refs/stash) und können mit gelöscht werden git stash drop stash@{n}, wobei ndie Nummer durch angezeigt wird git stash list.

Dahlbyk
quelle
20
Es beantwortet nicht die Titelfrage. Infolgedessen stimmen Leute wie ich, die über Google zu der Frage gelangen und nach der Antwort auf die Titelfrage suchen und sich nicht besonders um die tatsächlichen Details kümmern, die Person ab, die sie tatsächlich beantwortet hat. Einige Leute stimmen die akzeptierte Antwort auch boshaft ab, weil es ihnen nicht hilft. Ich persönlich habe gerade die Antwort positiv bewertet, die mir geholfen hat.
ArtOfWarfare
15
Also: 1) Google "git delete stash" 2) Klicken Sie auf den SO-Link basierend auf der ersten Hälfte des Fragentitels. 3) Stimmen Sie die richtige Antwort für die zweite Hälfte des Titels ab. Das ist neu.
Dahlbyk
10
@ArtOfWarfare Das wäre dann ein Mangel an Leseverständnis, denn dies ist ganz klar eine Antwort auf die "Titelfrage".
Chris Hayes
1
Meinetwegen. Ich erstelle meine Stashes mit just git stash- ich weiß nicht, ob das tatsächlich git stash createoder etwas anderes zugeordnet ist. Git ist sicherlich etwas, worüber ich noch lerne (wenn es nicht so wäre, würde ich SO Q & As nicht so lesen.)
ArtOfWarfare
1
@AdrianPronk Dies ist genau das, wofür ich empfehlen würde, es tatsächlich zu verwenden git stash create. Anstatt in einer Patch-Datei mit Zeitstempel zu speichern, können Sie das Git-Reflog einfach in einer benutzerdefinierten Referenz (z refs/backup. B. ) für Sie speichern lassen . Ich würde versuchen, etwas wie 1) git stash create, 2) den Baum eines neuen Stashs mit refs/backup^{tree}3) zu vergleichen, wenn der Baum anders ist , git update-ref --create-reflog refs/backup <stash-sha>. Eventuell werden alte Backup-Stashes automatisch entfernt.
Dahlbyk
838

git stash dropNimmt keinen Parameter - der den obersten Stash löscht - oder eine Stash-Referenz, die so aussieht: stash@{n}welche nnominiert, welcher Stash gelöscht werden soll. Sie können keine Commit-ID an übergeben git stash drop.

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

Durch das Löschen eines Stashs werden die Bezeichnungen aller Stashes weiter unten im Stapel geändertstash@{n} .

Ich bin mir nicht sicher, warum Sie denken, dass Sie einen Stash löschen müssen, denn wenn Sie stash createeinen Stash-Eintrag verwenden, wird dieser nicht für Ihren "Stash" erstellt, sodass Sie nichts löschen können.

CB Bailey
quelle
Nun, der Eintrag wird mit "stash" erstellt ... Man würde logischerweise denken, dass er mit "stash" entfernt wird.
Paul Wagland
2
Schauen Sie sich die Manpage für Git Stash an. stash create erstellt keinen Eintrag, sondern nur das Commit-Objekt für den Stash, sodass im Stash-Protokoll kein Eintrag zum Entfernen vorhanden ist.
CB Bailey
3
Von man : create Erstellt einen Stash (bei dem es sich um ein reguläres Commit-Objekt handelt) und gibt seinen Objektnamen zurück, ohne ihn irgendwo im ref-Namespace zu speichern.
Ruffin
40
Achtung : Sie sollten wahrscheinlich nicht mehrere wie 1, 2, 3 fallen lassen, da Sie am Ende tatsächlich die ursprünglichen Zahlen 1, 3 und 5 fallen lassen. Der richtige Weg, 1, 2 und 3 fallen zu lassen, wäre zu Führen Sie sie in der Reihenfolge 3, 2, 1 oder 1, 1, 1 aus. Außerdem ist 0 indiziert, wobei 0 oben im Stapel steht.
ArtOfWarfare
2
Git Extensions gibt einen unbekannten Befehl aus, wenn die Schaltfläche "Änderungen speichern" gedrückt wird, und alles, was es tut, bleibt beim Beenden und Neustarten der Anwendung bestehen. Es gibt keine offensichtliche Möglichkeit, den Stash über die GUI zu entfernen, aber in der Befehlszeile zeigt "git stash list" den WIP-Stash an und "git stash clear" entfernt ihn.
Dave
215

Wenn Sie zu 100% sicher sind, dass Sie nur einen Stash haben oder alle Stashes löschen möchten (stellen Sie einen Wert vongit stash list 107% sicher), können Sie Folgendes tun:

git stash clear

..und vergiss sie (es löscht alle Verstecke).

Hinweis: Diese Antwort wurde für diejenigen hinzugefügt, die hier gelandet sind und nach einer Möglichkeit suchen, sie alle zu löschen (wie ich).

Felipe Pereira
quelle
26
Wenn Sie nur einen Vorrat haben, würde ich trotzdem empfehlen, ihn zu verwenden git stash drop, da dadurch nur ein Vorrat abfällt und Sie sich keine Sorgen machen müssen, mehr als erwartet zu verlieren.
Paul Wagland
Upvoted, da es tatsächlich die Frage beantwortet, ob es die beste Vorgehensweise ist oder nicht. Ich brauche das tatsächlich, da die Verstecke, die ich heute erstellt habe, weg sein müssen.
Alex McCabe
2
Ich benutze Stash schon lange. Diesmal konnte ich jedoch den letzten Vorrat, den ich gemacht hatte, nicht loswerden, indem ich ihn einfach git stash dropwie gewohnt benutzte . Ich bin mir nicht sicher, was ich anders gemacht habe. Jedenfalls hat git stash clearfür mich gearbeitet. Wusste nicht, dass es existiert. +1
Konstantinos Gaitanis
3
+1, weil git sich weigerte, den Stash zu löschen, da eine der vom Stash erstellten Dateien bereits vorhanden war.
Thiago Barcala
12
speziell 107% sicher.
Levininja
84

Aus dem Git-Dokument: http://git-scm.com/docs/git-stash

drop [-q | --quiet] []

Entfernen Sie einen einzelnen versteckten Status aus der Stash-Liste. Wenn nein angegeben wird, wird die neueste entfernt. dh stash@{0}andernfalls muss eine gültige Stash-Protokollreferenz des Formulars stash @ {} vorhanden sein.

Beispiel:

git stash drop stash@{5}

Dies würde den Stash-Eintrag 5 löschen. So zeigen Sie die gesamte Liste der Stashes an:

git stash list
Jorge
quelle
4
Abgesehen davon, dass ich am Ende der Frage ausdrücklich sage, dass Git Stash Drop nicht das tut, was ich will.
Paul Wagland
1
Ich würde empfehlen, den Inhalt eines Stashs mit - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}vor der Ausführung zu überprüfen git stash drop. Glauben Sie mir, es wird eine Menge Ärger sparen :)
realPK
71

Sie sollten verwenden

git stash save

und nicht

git stash create

da dies einen Stash erstellt (der ein reguläres Commit-Objekt ist) und seinen Objektnamen zurückgibt, ohne ihn irgendwo im ref-Namespace zu speichern . Daher wird mit Stash Apply nicht zugänglich sein.

Die Verwendung git stash save "some comment"wird verwendet, wenn Sie nicht bereitgestellte Änderungen vorgenommen haben, die Sie replizieren / in einen anderen Zweig verschieben möchten

Verwenden Sie git stash apply stash@{0}(vorausgesetzt, Ihr gespeicherter Versteckindex ist 0), wenn Ihre gespeicherten (verdeckten) Änderungen sich auf Ihren aktuellen Zweig auswirken sollen

Sie können jederzeit git stash listalle Ihre Versteckindizes überprüfen

und verwenden Sie git stash drop stash@{0}(vorausgesetzt, Ihr gespeicherter Stash-Index ist 0 und Sie möchten ihn löschen), um einen bestimmten Stash zu löschen.

Shalom Sam
quelle
3
Nur zur Information - Einfache Eingabe des Befehls ist git stashstandardmäßiggit stash save
RBT
1
git stash createsoll von Skripten verwendet werden. Das ist der Anwendungsfall von OP. Daher kann die Empfehlung git stash savefür "normale" Anwendungen nützlich sein, nicht jedoch für den Anwendungsfall von OP. OP möchte vielleicht einen Blick auf die Dokumente werfen : Es gibt mehr Befehle im Zusammenhang mit Skripten, zum Beispielgit stash store
Adrian W
1
git stash save "message"heutzutage sollte lesen git stash push -m "message". Vergleichen Siegit commit -m "message"
Tino
2

Es funktioniert auch

git stash drop <index>

mögen

git stash drop 5
MonTea
quelle
1

Das Dokument ist hier (auf Chinesisch) bitte klicken.

Sie können verwenden

Git Stash Liste

git stash drop stash @ {0}

Geben Sie hier die Bildbeschreibung ein

Longalei
quelle
git stash createunterscheidet sich git stash saveinsbesondere davon, dass das Erstellungsformular nicht in der Liste angezeigt wird und nicht gelöscht werden kann, daher die Frage.
Paul Wagland
@PaulWagland Vielen Dank für Ihre Antwort und geben Sie die Antwort. Ehrlich gesagt , Ich finde das "git stash create" nicht im offiziellen Dokument. Aber darüber interessiert es mich. Wenn Sie das "git stash create" in der "git stash list" finden möchten. Sie können dies oben tun.
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
quelle