Como excluir um stash criado com o git stash create?

549

O Git stash parece fazer muito do que eu quero, exceto que é um pouco difícil de script, pois se você não tiver alterações, git stash; git stash popfará algo diferente do que se você tiver alterações em seu repositório.

Parece que git stash createé a resposta para esse problema, e tudo funciona, exceto por uma coisa ... Não consigo me livrar do estoque criado. Existe alguma maneira de se livrar do esconderijo?

Para deixar 100% claro o que estou fazendo:

Crie o 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

Use o esconderijo:

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

Exclua o stash: (exceto que este último bit não funciona)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Paul Wagland
fonte
Apesar da distância no tempo, quero salientar aos companheiros de viagem que a git applyexecução na segunda caixa de código no momento da redação deste documento não aplicava um patch - a mensagem de erro na saída informava isso. Então, na verdade, você tentou criar um stash (que não funcionou, veja os comentários abaixo), aplique um stash que não foi criado e solte um stash que não foi criado. É por isso que nada que você fez funcionou.
Professor Tom
1
@ ProfessorTom o stash foi criado, é por isso que ele retornou um código hash e por git stash applyque funcionou. As git applytentativas de ler um arquivo de patch local, que não existe. Para ser honesto, provavelmente não deveria estar lá, e nunca poderia ter funcionado. Estou vagamente tentado a removê-lo da questão, mas, como ele ajudou muitos em sua forma atual, vou deixá-lo como está.
Paul Wagland

Respostas:

369

Para excluir um stash normal criado com git stash, você deseja git stash dropou git stash drop stash@{n}. Veja abaixo para mais detalhes.


Você não precisa excluir um stash criado com git stash create. Dos documentos:

Crie uma entrada stash (que é um objeto de confirmação regular) e retorne seu nome de objeto, sem armazená-la em qualquer lugar no espaço para nome ref. Isso pretende ser útil para scripts. Provavelmente não é o comando que você deseja usar; veja "salvar" acima.

Como nada faz referência ao commit do stash, ele será coletado como lixo eventualmente.


Um stash criado com git stashou git stash saveé salvo em refs/stashe pode ser excluído com git stash drop. Como em todos os objetos Git, o conteúdo do stash real não é excluído do computador até que gcos objetos sejam removidos após a expiração (o padrão é 2 semanas depois).

Os stashes mais antigos são salvos no refs/stash reflog (tentativa cat .git/logs/refs/stash) e podem ser excluídos com git stash drop stash@{n}, onde né o número mostrado por git stash list.

dahlbyk
fonte
20
Não responde à pergunta titular. Como resultado, pessoas como eu, que chegam à pergunta pelo Google procurando a resposta para a pergunta titular e não se importam com os detalhes reais, votam na pessoa que realmente respondeu. Algumas pessoas também votam com desdém a resposta aceita, porque ela não as ajuda. Pessoalmente, acabei de votar na resposta que me ajudou.
ArtOfWarfare 17/09/2013
15
Assim: 1) Google "git delete stash" 2) clique no link SO com base na primeira metade do título da pergunta 3) reduza a resposta correta específica à segunda metade do título. Essa é nova.
Dahlbyk
10
@ArtOfWarfare Isso seria uma falta de compreensão de leitura, porque é uma resposta muito clara à "questão titular".
precisa saber é o seguinte
1
Justo. Eu crio meus stashes usando apenas git stash- não sei se isso realmente mapeia git stash createou algo mais. Git é certamente algo que eu ainda estou aprendendo sobre (se não fosse, eu não estaria lendo SO Q & A como esta.)
ArtOfWarfare
1
@AdrianPronk Esse é exatamente o tipo de coisa que eu recomendaria realmente usar git stash create. Em vez de salvar em um arquivo de patch com carimbo de data e hora, você pode apenas deixar o git reflog salvá-lo em uma referência personalizada (por exemplo refs/backup). Eu tentaria algo como 1) git stash create, 2) compare a nova árvore de esconderijo com refs/backup^{tree}, 3) se a árvore for diferente git update-ref --create-reflog refs/backup <stash-sha>,. Eventualmente, os stashes de backup antigos serão removidos automaticamente.
dahlbyk
838

git stash dropnão usa nenhum parâmetro - que elimina o stash superior - ou uma referência de stash que se parece com: stash@{n}qual nnomeia qual stash a ser descartado. Você não pode passar um ID de confirmação git stash drop.

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

Soltar um stash alterará as stash@{n}designações de todos os stash mais abaixo na pilha.

Não sei por que você acha que precisa soltar um stash porque, se você estiver usando stash createuma entrada de stash, não é criado para o seu "stash", não há nada para soltar.

CB Bailey
fonte
Bem, a entrada é criada usando "stash" ... Alguém poderia pensar logicamente que seria removido usando "stash".
precisa saber é o seguinte
2
Veja a página de manual do git stash. stash create não cria uma entrada, apenas o objeto de confirmação para o stash, portanto não há nenhuma entrada no log stash a ser removida.
CB Bailey
3
Do man : create Crie um stash (que é um objeto de confirmação regular) e retorne seu nome de objeto, sem armazená-lo em qualquer lugar no espaço para nome ref.
Ruffin
40
Cuidado : você provavelmente não deve descartar vários como 1, 2, 3, pois acabará descartando o que era originalmente os números 1, 3 e 5. A maneira correta de descartar 1, 2 e 3 seria: faça-os na ordem 3, 2, 1 ou 1, 1, 1. Além disso, é 0 indexado, com 0 estando no topo da pilha.
ArtOfWarfare 17/09/2013
2
O Git Extensions emite um comando desconhecido quando o botão "Stash Changes" é pressionado, e tudo o que faz persiste ao sair e reiniciar o aplicativo. Não há uma maneira óbvia de se livrar do stash usando a GUI, mas a partir da linha de comando "git stash list" mostra o stipe WIP e "git stash clear" se livra dele.
31516 Dave
215

Se você tem 100% de certeza de ter apenas um stash ou deseja excluir todos os stash ( git stash listcertifique-se de ter 107% de certeza), você pode:

git stash clear

..e esqueça-os (apaga todos os esconderijos).

Nota: Adicionada esta resposta para aqueles que acabaram aqui procurando uma maneira de limpá-los todos (como eu).

Felipe Pereira
fonte
26
Se você tiver apenas um estoque, eu ainda recomendaria usá-lo git stash drop, pois isso apenas descarta um estoque e você não precisa se preocupar em perder mais do que o esperado.
Paul Wagland
Votado como ele realmente responde à pergunta, se é uma prática recomendada ou não. Na verdade, eu preciso disso, pois os esconderijos que criei hoje precisam desaparecer.
Alex McCabe
2
Estou usando o stash há muito tempo. Desta vez, porém, não consegui me livrar do último estoque que fiz simplesmente usando git stash dropcomo de costume. Não tenho certeza do que fiz de maneira diferente. Enfim, git stash clearfuncionou para mim. Não sabia que existia. +1
Konstantinos Gaitanis
3
+1 porque o git estava se recusando a descartar o stash, já que um dos arquivos criados pelo stash já existia agora.
Thiago Barcala
12
107%, com certeza.
levininja
84

No documento git: http://git-scm.com/docs/git-stash

solte [-q | --quiet] []

Remova um único estado oculto da lista de esconderijos. Quando não é dado, ele remove o último. ou seja stash@{0}, caso contrário, deve ser uma referência de log stash válida do formulário stash @ {}.

exemplo:

git stash drop stash@{5}

Isso excluiria a entrada stash 5. Para ver toda a lista de stash:

git stash list
Jorge
fonte
4
Só que eu digo explicitamente no final da pergunta que o git stash drop não faz o que eu quero.
Paul Wagland
1
Eu recomendaria verificar o conteúdo de um stash usando - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}antes de executar git stash drop. Acredite em mim, ele vai salvar um monte de problemas :)
realPK
71

Você deveria estar usando

git stash save

e não

git stash create

porque isso cria uma ocultação (que é um objeto de confirmação regular) e retorna seu nome de objeto, sem armazená-lo em qualquer lugar no espaço para nome ref. Portanto, não será acessível com a aplicação de stash.

O uso git stash save "some comment"é usado quando você tem alterações em estágios que deseja replicar / mover para outra ramificação

Use git stash apply stash@{0}(supondo que seu índice de stash salvo seja 0) quando desejar que as alterações salvas (armazenadas) reflitam em sua ramificação atual

você sempre pode usar git stash listpara verificar todos os seus índices stash

e use git stash drop stash@{0}(supondo que seu índice de stash salvo seja 0 e você deseja excluí-lo) para excluir um stash específico.

Shalom Sam
fonte
3
Apenas para informação - Basta digitar o comando git stashpadrãogit stash save
RBT 13/17
1
git stash createdestina-se a ser usado por scripts. Esse é o caso de uso do OP. Portanto, a recomendação git stash savepode ser útil para usos "normais", mas não para o caso de uso do OP. O OP pode querer dar uma olhada nos documentos : há mais comandos relacionados a scripts, por exemplogit stash store
Adrian W
1
git stash save "message"hoje em dia deve ler git stash push -m "message". Comparegit commit -m "message"
Tino
2

Também funciona

git stash drop <index>

gostar

git stash drop 5
MonTea
fonte
1

O documento está aqui (em chinês), por favor clique.

você pode usar

lista de stash git

git stash drop stash @ {0}

insira a descrição da imagem aqui

Longalei
fonte
git stash createé diferente de git stash save, em particular, o formulário de criação não aparece na lista e não pode ser descartado, daí a pergunta.
Paul Wagland 26/07/19
@PaulWagland Obrigado sua resposta e forneça a resposta. Honestamente, não encontrei o "git stash create" no documento oficial. Mas, sobre isso, está interessado. Se você deseja encontrar o "git stash create" na "lista de git stash". Você pode fazer isso acima.
Longalei 28/07/19
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
fonte