Jak usunąć skrytkę utworzoną za pomocą git stash create?

548

Wygląda na to, że Git Stash robi wiele tego, czego chcę, poza tym, że jest to trochę trudne do napisania, ponieważ jeśli nie masz żadnych zmian, git stash; git stash popzrobisz coś innego niż zmiany w twoim repozytorium.

Wydaje się, że git stash createto jest odpowiedź na ten problem i wszystko działa, z wyjątkiem jednej rzeczy… Nie mogę pozbyć się stworzonej skrytki. Czy jest jakiś sposób na pozbycie się skrytki?

Aby w 100% wyjaśnić, co robię:

Utwórz skrytkę:

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

Użyj skrytki:

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

Usuń skrytkę: (oprócz tego, że ten ostatni bit nie działa)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Paul Wagland
źródło
Pomimo odległości w czasie, chciałbym wskazać innym podróżnikom, że git applybieg w drugim polu kodu w momencie pisania tego tekstu nie zastosował łaty - komunikat o błędzie w danych wyjściowych powiedział ci to. W rzeczywistości próbowałeś utworzyć skrytkę (która nie działała, patrz komentarze poniżej), zastosować skrytkę, która nie została utworzona, a następnie upuścić skrytkę, która nie została utworzona. To dlatego nic nie działało.
Profesor Tom
1
@ProfessorTom skrytka została utworzona, dlatego zwróciła kod skrótu i ​​dlaczego git stash applyzadziałała. Do git applypróby odczytu lokalnego pliku łaty, które nie istnieje. Szczerze mówiąc, prawdopodobnie nie powinno tam być i nigdy nie mogłoby zadziałać. Kusi mnie, by usunąć to pytanie, ale biorąc pod uwagę, że pomogło tak wielu osobom w obecnej formie, pozostawię je bez zmian.
Paul Wagland,

Odpowiedzi:

367

Aby usunąć normalną skrytkę utworzoną za pomocą git stash, chcesz git stash droplub git stash drop stash@{n}. Zobacz więcej szczegółów.


Nie musisz usuwać skrytki utworzonej za pomocą git stash create. Z dokumentów:

Utwórz pozycję ukrytą (która jest zwykłym obiektem zatwierdzania) i zwróć jej nazwę obiektu, bez zapisywania go w dowolnym miejscu w przestrzeni nazw ref. Ma to być przydatne w skryptach. Prawdopodobnie nie jest to polecenie, którego chcesz użyć; patrz „zapisz” powyżej.

Ponieważ nic nie odwołuje się do zatwierdzenia skrytki, ostatecznie zostanie odebrane śmieci.


Skrytka utworzona za pomocą git stashlub git stash savejest zapisywana refs/stashi można ją usunąć za pomocą git stash drop. Podobnie jak w przypadku wszystkich obiektów Git, rzeczywista zawartość skrytki nie jest usuwana z komputera, dopóki nie gcwyciszy tych obiektów po ich wygaśnięciu (domyślnie jest to 2 tygodnie później).

Starsze skrytki są zapisywane w refs/stash rejestrze (try cat .git/logs/refs/stash) i można je usunąć za pomocą git stash drop stash@{n}, gdzie njest pokazany numer git stash list.

dahlbyk
źródło
20
Nie odpowiada na tytułowe pytanie. W rezultacie osoby takie jak ja, które docierają do pytania za pośrednictwem Google, szukając odpowiedzi na pytanie tytułowe i nie dbając szczególnie o szczegóły, głosuj na osobę, która faktycznie na nie odpowiedziała. Niektóre osoby złośliwie również głosują na zaakceptowaną odpowiedź, ponieważ to im nie pomaga. Właśnie osobiście głosowałem odpowiedź, która mi pomogła.
ArtOfWarfare
15
Tak więc: 1) Google „skasuj skrytkę” 2) kliknij SO link na podstawie pierwszej połowy tytułu pytania 3) zanotuj poprawną odpowiedź dotyczącą drugiej połowy tytułu. To jest nowe.
dahlbyk
10
@ArtOfWarfare Byłoby to wtedy brak rozumienia czytania, ponieważ jest to bardzo wyraźnie odpowiedź na „pytanie tytułowe”.
Chris Hayes
1
Słusznie. Moje skrytki tworzę za pomocą git stash- nie wiem, czy to faktycznie mapuje, git stash createczy coś innego. Git jest z pewnością czymś, o czym wciąż się uczę (gdyby nie było, nie
czytałbym
1
@AdrianPronk To jest dokładnie to, co zaleciłbym użyć git stash create. Zamiast zapisywać w pliku łaty ze znacznikiem czasu, możesz po prostu pozwolić git reflog zapisać go dla ciebie w niestandardowym ref (np refs/backup.). Chciałbym spróbować coś takiego: 1) git stash create, 2) porównanie tree nowego użytkownika z Stash refs/backup^{tree}, 3) jeśli drzewo jest inna git update-ref --create-reflog refs/backup <stash-sha>. Ostatecznie stare skrytki zapasowe zostaną automatycznie przycięte.
dahlbyk
838

git stash dropnie przyjmuje żadnego parametru - który upuszcza górną skrytkę - ani odniesienia do skrytki, które wygląda: stash@{n}które nwyznacza, którą skrytkę upuścić. Nie możesz przekazać identyfikatora zatwierdzenia do git stash drop.

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

Upuszczenie zapas będzie zmieniać się stash@{n}nazw wszystkich stashes dalej w dół stosu.

Nie jestem pewien, dlaczego uważasz, że musisz upuścić skrytkę, ponieważ jeśli używasz stash createskrytki, nie tworzona jest pozycja „skrytki”, więc nie ma nic do upuszczenia.

CB Bailey
źródło
Cóż, wpis jest tworzony za pomocą „skrytki”… Można logicznie pomyśleć, że można go usunąć za pomocą „skrytki”.
Paul Wagland
2
Spójrz na stronę podręcznika użytkownika na git stash. tworzenie skrytki nie tworzy wpisu, tylko obiekt zatwierdzenia dla skrytki, więc nie ma wpisu w dzienniku skrytek do usunięcia.
CB Bailey,
3
Od man : utwórz Utwórz skrytkę (która jest zwykłym obiektem zatwierdzania) i zwróć nazwę tego obiektu, bez przechowywania go w dowolnym miejscu w przestrzeni nazw ref.
ruffin
40
Uwaga : Prawdopodobnie nie powinieneś upuszczać wielokrotności takich jak 1, 2, 3, ponieważ w rzeczywistości skończysz upuszczanie tego, co pierwotnie było liczbami 1, 3 i 5. Prawidłowym sposobem upuszczenia 1, 2 i 3 byłoby wykonaj je w kolejności 3, 2, 1 lub 1, 1, 1. Ponadto jest indeksowane 0, przy czym 0 znajduje się na górze stosu.
ArtOfWarfare
2
Rozszerzenia Git wydają nieznane polecenie po naciśnięciu przycisku „Ukryj zmiany” i wszystko, co robi, utrzymuje się po wyjściu i ponownym uruchomieniu aplikacji. Nie ma oczywistego sposobu na pozbycie się skrytki za pomocą GUI, ale z wiersza poleceń „git stash list” pokazuje skrytkę WIP, a „git stash clear” się go pozbywa.
Dave
215

Jeśli masz 100% pewności, że masz tylko jedną skrytkę lub chcesz usunąć wszystkie skrytki (upewnij się git stash list, że masz 107%), możesz:

git stash clear

... i zapomnij o nich (usuwa wszystkie skrytki).

Uwaga: Dodano tę odpowiedź dla tych, którzy skończyli tutaj, szukając sposobu na usunięcie ich wszystkich (takich jak ja).

Felipe Pereira
źródło
26
Jeśli masz tylko jedną skrytkę, nadal polecam jej użyć git stash drop, ponieważ upuszcza ona tylko jedną skrytkę i nie musisz się martwić, że stracisz więcej niż oczekiwano.
Paul Wagland
Pozytywnie oceniany, ponieważ faktycznie odpowiada na pytanie, czy jest to najlepsza praktyka, aby to zrobić. Naprawdę tego potrzebuję, ponieważ skrytki, które dzisiaj stworzyłem, muszą zniknąć.
Alex McCabe
2
Używam skrytki od dłuższego czasu. Tym razem jednak nie byłem w stanie pozbyć się ostatniego skrytki, którą zrobiłem, po prostu używając git stash dropjak zwykle. Nie jestem pewien, co zrobiłem inaczej. W każdym razie git stash clearpracował dla mnie. Nie wiedziałem, że istnieje. +1
Konstantinos Gaitanis
3
+1, ponieważ git odmawia upuszczenia skrytki, ponieważ jeden z plików utworzonych przez skrytkę już istniał ..
Thiago Barcala
12
w szczególności 107% pewności.
levininja
84

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

upuść [-q | --quiet] []

Usuń pojedynczy stan skrytki z listy skrytek. Gdy nie podano, usuwa najnowszą. tzn. w stash@{0}przeciwnym razie musi istnieć poprawne odwołanie do dziennika skrytek formularza skrytka @ {}.

przykład:

git stash drop stash@{5}

Spowoduje to usunięcie wpisu 5. Aby zobaczyć całą listę ukrytych przedmiotów:

git stash list
Jorge
źródło
4
Tyle, że wyraźnie stwierdzam na dole pytania, że ​​upuszczanie git nie robi tego, co chcę.
Paul Wagland
1
Polecam sprawdzenie zawartości skrytki za pomocą - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}przed wykonaniem git stash drop. Uwierz mi, zaoszczędzi to wielu kłopotów :)
realPK 10.10.16
71

Powinieneś używać

git stash save

i nie

git stash create

ponieważ tworzy to skrytkę (która jest zwykłym obiektem zatwierdzania) i zwraca jej nazwę obiektu, bez przechowywania go w dowolnym miejscu w przestrzeni nazw ref. Dlatego nie będą dostępne przy zastosowaniu skrytki.

Użyj git stash save "some comment"jest używany, gdy masz nieustawione zmiany, które chcesz replikować / przenieść do innej gałęzi

Użyj git stash apply stash@{0}(zakładając, że zapisany indeks skrytki wynosi 0), jeśli chcesz, aby zapisane (ukryte) zmiany odzwierciedlały bieżącą gałąź

zawsze możesz użyć git stash listdo sprawdzenia wszystkich indeksów składowania

i użyj git stash drop stash@{0}(zakładając, że zapisany indeks skrytki wynosi 0 i chcesz go usunąć), aby usunąć określoną skrytkę.

Shalom Sam
źródło
3
Tylko dla informacji - wystarczy wpisać polecenie git stashdomyślnie nagit stash save
RBT
1
git stash createjest przeznaczony do użycia przez skrypty. To jest przypadek użycia OP. Tak więc rekomendowanie git stash savemoże być przydatne w przypadku „normalnych” zastosowań, ale nie w przypadku użycia OP. OP może chcieć rzucić okiem na dokumenty : jest więcej poleceń związanych ze skryptami, na przykładgit stash store
Adrian W
1
git stash save "message"dziś powinien przeczytać git stash push -m "message". Porównajgit commit -m "message"
Tino
2

To też działa

git stash drop <index>

lubić

git stash drop 5
MonTea
źródło
1

Dokument jest tutaj (w języku chińskim), kliknij.

możesz użyć

lista skrytek git

git stash drop stash @ {0}

wprowadź opis zdjęcia tutaj

Longalei
źródło
git stash createróżni się git stash savew szczególności tym, że formularz tworzenia nie pojawia się na liście i nie można go usunąć, stąd pytanie.
Paul Wagland
@PaulWagland Dziękujemy za odpowiedź i udzielamy odpowiedzi. Szczerze mówiąc, nie widzę „git stash create” w oficjalnym dokumencie. Ale o tym mnie interesuje. Jeśli chcesz znaleźć „git stash create” na „liście git stash”. możesz to zrobić powyżej.
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
źródło