Come eliminare uno stash creato con git stash create?


549

Git stash sembra fare molto di ciò che voglio, tranne per il fatto che è un po 'difficile da scrivere, dato che se non hai cambiamenti, allora git stash; git stash popfarà qualcosa di diverso rispetto a se hai cambiamenti nel tuo repository.

Sembra che git stash createsia la risposta a quel problema, e tutto funziona, tranne una cosa ... Non riesco a liberarmi della scorta creata. C'è un modo per sbarazzarsi della scorta?

Per chiarire al 100% cosa sto facendo:

Crea lo stash:

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

Usa lo stash:

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

Elimina lo stash: (tranne per il fatto che quest'ultimo bit non funziona)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference

Nonostante la distanza nel tempo, voglio sottolineare ai compagni di viaggio che la git applycorsa nella seconda casella di codice al momento della stesura di questo articolo non ha applicato una patch: il messaggio di errore nell'output ti ha detto questo. Quindi, in effetti, hai provato a creare uno stash (che non ha funzionato, vedi commenti sotto) applicare uno stash che non è stato creato, quindi rilasciare uno stash che non è stato creato. Questo è il motivo per cui nulla ha funzionato.
Professor Tom

1
@ProfessorTom lo stash è stato creato, ecco perché ha restituito un codice hash e perché git stash applyha funzionato. I git applytentativi di leggere un file patch locale, che non esiste. Ad essere onesti, probabilmente non dovrebbe essere lì e non avrebbe mai potuto funzionare. Sono vagamente tentato di rimuoverlo dalla domanda, ma dato che ha aiutato così tanti nella sua forma attuale, lo lascerò così com'è.
Paul Wagland,

Risposte:


369

Per eliminare una normale scorta creata con git stash, si desidera git stash dropo git stash drop stash@{n}. Vedi sotto per ulteriori dettagli.


Non è necessario eliminare uno stash creato con git stash create. Dai documenti:

Creare una voce stash (che è un oggetto commit regolare) e restituire il nome dell'oggetto, senza memorizzarlo in un punto qualsiasi dello spazio dei nomi ref. Questo è utile per gli script. Probabilmente non è il comando che vuoi usare; vedi "salva" sopra.

Dato che nulla fa riferimento al commit stash, alla fine verrà raccolta la spazzatura.


Una scorta creata con git stasho git stash saveviene salvata in refs/stashe può essere eliminata con git stash drop. Come per tutti gli oggetti Git, i contenuti effettivi dello stash non vengono eliminati dal computer fino a quando gcquesti non vengono eliminati (il valore predefinito è 2 settimane dopo).

Gli stash più vecchi vengono salvati nel refs/stash reflog (prova cat .git/logs/refs/stash) e possono essere eliminati con git stash drop stash@{n}, dove nè il numero mostrato da git stash list.


20
Non risponde alla domanda titolare. Di conseguenza, persone come me, che arrivano alla domanda tramite Google alla ricerca della risposta alla domanda principale e non si preoccupano particolarmente dei dettagli effettivi, votano la persona che ha effettivamente risposto. Alcune persone votano malvolentieri la risposta accettata perché non li aiuta. Personalmente ho appena votato la risposta che mi ha aiutato.
ArtOfWarfare,

15
Quindi: 1) Google "git delete stash" 2) fai clic sul link SO in base al titolo della prima metà della domanda 3) vota la risposta corretta specifica per la seconda metà del titolo. Questo è nuovo.
Dahlbyk,

10
@ArtOfWarfare Sarebbe quindi una mancanza di comprensione della lettura, perché questa è chiaramente una risposta alla "domanda titolare".
Chris Hayes,

1
Giusto. Creo i miei stash usando solo git stash- non so se questo sia effettivamente mappato git stash createo qualcos'altro. Git è sicuramente qualcosa di cui sto ancora imparando (se non lo fosse, non avrei letto SO Q & As in questo modo.)
ArtOfWarfare

1
@AdrianPronk Questo è esattamente il genere di cose che consiglierei di utilizzare git stash createper. Invece di salvare in un file patch con timestamp, potresti semplicemente lasciare che git reflog lo salvi per te in un riferimento personalizzato (ad es refs/backup.). Vorrei provare qualcosa come 1) git stash create, 2) confrontare il nuovo albero di scorta con refs/backup^{tree}, 3) se l'albero è diverso git update-ref --create-reflog refs/backup <stash-sha>,. Eventuali vecchi blocchi di backup verranno eliminati automaticamente.
Dahlbyk,

838

git stash dropnon accetta alcun parametro - che elimina lo stash superiore - o un riferimento allo stash che assomigli a: stash@{n}quale nnomina quale stash rilasciare. Non è possibile passare un ID di commit a git stash drop.

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

La caduta di uno stash cambierà le stash@{n}designazioni di tutti gli stash più in basso nello stack.

Non sono sicuro del motivo per cui pensi di dover eliminare uno stash perché se stai utilizzando stash createuna voce stash non viene creata per il tuo "stash", quindi non c'è nulla da eliminare.


Bene, la voce viene creata usando "stash" ... Logicamente si potrebbe pensare che sarebbe stata rimossa usando "stash".
Paul Wagland,

2
Guarda la pagina man per git stash. stash create non crea una voce, ma solo l'oggetto commit per lo stash, quindi non c'è alcuna voce nel registro stash da rimuovere.
CB Bailey,

3
Dall'uomo : create Crea uno stash (che è un oggetto commit regolare) e restituisce il nome dell'oggetto, senza memorizzarlo in nessun punto dello spazio dei nomi ref.
ruffin,

41
Attenzione : probabilmente non dovresti rilasciare multipli come 1, 2, 3, poiché finirai per eliminare quelli che erano originariamente i numeri 1, 3 e 5. Il modo corretto di rilasciare 1, 2 e 3 sarebbe fateli nell'ordine 3, 2, 1 o 1, 1, 1. Inoltre, è 0 indicizzato, con 0 in cima alla pila.
ArtOfWarfare,

2
Git Extensions emette un comando sconosciuto quando si preme il pulsante "Stash Changes" e qualunque cosa persista per uscire e riavviare l'applicazione. Non esiste un modo ovvio per sbarazzarsi dello stash utilizzando la GUI, ma dalla riga di comando "git stash list" mostra lo stash WIP e "git stash clear" lo elimina.
Dave,

215

Se sei sicuro al 100% di avere solo uno stash o desideri eliminare tutti gli stash (assicurati git stash listdi essere sicuro del 107%), puoi fare un:

git stash clear

..e dimenticatene (elimina tutte le scorte).

Nota: aggiunta questa risposta per coloro che sono finiti qui alla ricerca di un modo per cancellarli tutti (come me).


26
Se hai solo una scorta, consiglierei comunque di usarla git stash drop, dal momento che lascia cadere solo una scorta, e non devi preoccuparti di perdere più del previsto.
Paul Wagland,

Eseguito l'upgrade in quanto risponde effettivamente alla domanda, indipendentemente dal fatto che sia consigliabile farlo. In realtà ne ho bisogno, dato che le scorte che ho creato oggi devono essere sparite.
Alex McCabe,

2
Sto usando stash da molto tempo ormai. Questa volta però non sono riuscito a liberarmi dell'ultima scorta che ho fatto semplicemente usando git stash dropcome al solito. Non sono sicuro di cosa ho fatto diversamente. Comunque, ha git stash clearfunzionato per me. Non sapevo che esistesse. +1
Konstantinos Gaitanis,

3
+1 perché git si stava rifiutando di eliminare lo stash, poiché uno dei file creati dallo stash esisteva già ora ..
Thiago Barcala

12
in particolare, sicuro al 107%.
levininja,

84

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

drop [-q | --quiet] []

Rimuovere un singolo stato nascosto dall'elenco di rifiuti. Quando non viene fornito, viene rimosso l'ultimo. vale a dire stash@{0}, altrimenti deve essere un riferimento log stash valido del modulo stash @ {}.

esempio:

git stash drop stash@{5}

Ciò eliminerebbe la voce di stash 5. Per vedere tutto l'elenco di stash:

git stash list

4
Solo che dico esplicitamente in fondo alla domanda che git stash drop non fa quello che voglio.
Paul Wagland,

1
Consiglierei di controllare il contenuto di una scorta usando - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}prima di eseguire git stash drop. Credetemi, salverà molti problemi :)
realPK

71

Dovresti usare

git stash save

e non

git stash create

perché questo crea uno stash (che è un oggetto commit regolare) e restituisce il suo nome oggetto, senza memorizzarlo ovunque nello spazio dei nomi ref. Quindi non sarà accessibile con l'applicazione stash.

L'utilizzo git stash save "some comment"viene utilizzato quando si hanno modifiche non messe in scena che si desidera replicare / spostare su un altro ramo

Utilizzare git stash apply stash@{0}(presupponendo che l'indice di scorta salvato sia 0) quando si desidera che le modifiche salvate (riposte) si riflettano sul ramo corrente

puoi sempre usare git stash listper controllare tutti gli indici di scorta

e utilizzare git stash drop stash@{0}(supponendo che l'indice di scorta salvato sia 0 e si desidera eliminarlo) per eliminare una scorta particolare.


3
Solo per informazione - Basta digitare il comando per git stashimpostazione predefinitagit stash save
RBT

1
git stash createè destinato ad essere utilizzato dagli script. Questo è il caso d'uso di OP. Pertanto, raccomandare git stash savepuò essere utile per usi "normali", ma non per il caso d'uso di OP. OP potrebbe voler dare un'occhiata ai documenti : ci sono più comandi relativi allo scripting, ad esempiogit stash store
Adrian W,

1
git stash save "message"al giorno d'oggi dovrebbe leggere git stash push -m "message". Confrontagit commit -m "message"
Tino,

2

Funziona anche

git stash drop <index>

piace

git stash drop 5

1

Il documento è qui (in cinese) , fare clic.

Puoi usare

git stash list

git stash drop stash @ {0}

inserisci qui la descrizione dell'immagine


git stash createè diverso git stash save, in particolare, il modulo di creazione non viene visualizzato nell'elenco e non può essere eliminato, quindi la domanda.
Paul Wagland,

@PaulWagland Grazie per la risposta e fornire la risposta. Onestamente , Non trovo la "git stash create" nel documento ufficiale. Ma a questo proposito, mi interessa. Se vuoi trovare "git stash create" nella "git stash list". puoi farlo sopra.
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.