git stash
Guardar as mudanças de um diretório de trabalho modificado
O comando 'git stash' pega as suas mudanças sem commit (preparadas ou não), guarda para usar depois e as retira da sua cópia de trabalho. Você pode reaplicar as mudanças guardadas depois com 'git stash pop' ou 'git stash apply'. O stash é útil quando você precisa trocar de contexto rapidamente para trabalhar em outra coisa, mas está no meio de uma mudança que ainda não está pronta para commit. O stash funciona como uma pilha, então você pode ter vários.
Sinopse
git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet] [-u | --include-untracked] [-a | --all] [(-m | --message) <message>] [--] [<pathspec>...]]
git stash clearOpções
Escolhendo a opção certa
Restaurar mudanças guardadas no stash
Escolher o comando certo para restaurar o seu trabalho guardado
| Comando | Mantém o stash? | Aplica em | Em caso de conflito |
|---|---|---|---|
git stash pop | Não - removido depois de aplicar | Branch atual | Stash mantido, precisa resolver |
git stash apply | Sim - continua na pilha | Branch atual | Stash mantido, precisa resolver |
git stash branch <name> | Não - removido depois de aplicar | Branch nova na base do stash | Sem conflitos (branch nova) |
O que vai para o stash?
Controlar quais arquivos entram no stash
| Comando | Rastreados modificados | Preparados | Não rastreados | Ignorados |
|---|---|---|---|---|
git stash | Sim | Sim | No | No |
git stash -u | Sim | Sim | Sim | No |
git stash -a | Sim | Sim | Sim | Sim |
git stash -k | Sim | Sim (e também continuam preparados) | No | No |
Stash e outras formas de guardar
Quando usar stash e quando usar as alternativas
| Comando | Onde fica guardado | Compartilhável | Ideal para |
|---|---|---|---|
git stash | Reflog local | No | Troca rápida de contexto, salvamento temporário |
git commit (WIP) | Histórico da branch | Sim (se enviado) | Trabalho que você talvez queira compartilhar ou consultar |
git worktree | Diretório separado | N/A | Trabalhar em várias branches ao mesmo tempo |
Gerenciar vários stashes
Comandos para trabalhar com a pilha do stash
| Comando | Mostra o conteúdo | Modifica a pilha | Caso de uso |
|---|---|---|---|
git stash list | Índice + mensagem | No | Ver todos os stashes |
git stash show | Diffstat | No | Olhada rápida nas mudanças |
git stash show -p | Diff completo | No | Revisão detalhada antes de aplicar |
git stash drop | No | Sim (remove um) | Excluir um stash específico |
git stash clear | No | Sim (remove TODOS) | Começar do zero (perigoso) |
Exemplos
Guardar as mudanças atuais com stash
git stashSalva todas as mudanças sem commit (preparadas e não preparadas) na pilha do stash e volta o diretório de trabalho ao HEAD.
Stash com uma mensagem descritiva
git stash push -m "WIP: login feature"Guarda as mudanças com uma mensagem personalizada, para identificar fácil quando há vários stashes.
Aplicar e remover o último stash
git stash popAplica o stash mais recente (stash@{0}) no seu diretório de trabalho e o remove da pilha.
Listar todos os stashes
git stash listMostra todas as entradas do stash com índice, nome da branch e mensagem. Útil para gerenciar vários stashes.
Exemplos de fluxos de trabalho
git stashGuardar as mudanças atuais no stash
git checkout other-branchTrocar para a outra branch
(do work, commit if needed)Concluir o trabalho urgente
git checkout original-branchVoltar para a sua branch
git stash popRestaurar as mudanças guardadas
git stash push -m "WIP: login validation"Stash com mensagem descritiva
(days later...)O tempo passa
git stash listVer todos os stashes com as mensagens
git stash show stash@{0}Pré-visualizar o conteúdo do stash
git stash popAplicar e remover quando estiver pronto
git stashGuardar as suas mudanças no stash
git checkout branch-aTrocar para a primeira branch
git stash applyAplicar (mantém o stash)
git commit -m "Add feature"Fazer commit na branch-a
git checkout branch-bTrocar para a segunda branch
git stash applyAplicar o mesmo stash de novo
git stash dropLimpar ao terminar
git add ready-file.jsPreparar as mudanças prontas
git stash -kGuardar o não preparado, manter o preparado
git commit -m "Ready feature"Fazer commit das mudanças preparadas
git stash popRestaurar o resto do seu trabalho
Solução de problemas
error: Your local changes to the following files would be overwritten by merge
Causa: Tentar fazer pop/apply de um stash que conflita com o diretório de trabalho atual
Faça commit ou stash das mudanças atuais antes, ou use 'git stash branch <name>' para criar uma branch nova a partir do stash
No stash entries found
Causa: A pilha do stash está vazia ou você está olhando o índice errado
Rode 'git stash list' para ver os stashes disponíveis. Lembre que stash@{0} é o mais recente.
O stash não guardou os meus arquivos novos
Causa: Por padrão, o git stash só guarda arquivos rastreados
Use 'git stash -u' para incluir arquivos não rastreados, ou 'git stash -a' para incluir também os ignorados
Apliquei o stash errado / quero desfazer um pop
Causa: Você fez pop da entrada errada do stash
Se o pop falhou com conflitos, o stash continua lá. Se deu certo, as suas mudanças estão no diretório de trabalho - é só rodar 'git stash' de novo se precisar
Stash perdido depois de clear/drop
Causa: git stash clear/drop remove para sempre entradas do stash
Tente 'git fsck --unreachable | grep commit' e depois 'git show <hash>' para achar commits de stash perdidos. A recuperação não é garantida.
Dicas e armadilhas
Boas práticas
- ✓Sempre use mensagens descritivas com 'git stash push -m "description"' - você vai agradecer depois
- ✓Prefira 'git stash apply' a 'git stash pop' quando talvez precise do stash de novo
- ✓Use 'git stash -u' se tiver arquivos novos não rastreados que quer guardar
- ✓Não deixe os stashes se acumularem - limpe os antigos com frequência usando 'git stash drop'
- ✓Para guardar algo por muito tempo, considere um commit WIP em vez de stash
- ✓Use 'git stash show -p' para revisar o conteúdo de um stash antes de aplicá-lo
- ✓Quando o stash pop falha por conflitos, o stash é mantido - resolva os conflitos e depois exclua-o à mão
Erros comuns
- ✗Esquecer que o 'git stash' por padrão só guarda arquivos rastreados. Use '-u' ou '--include-untracked' para guardar arquivos novos não rastreados.
- ✗Usar 'git stash pop' quando talvez queira aplicar o mesmo stash em várias branches. Use 'git stash apply' para manter o stash.
- ✗Não dar mensagens descritivas aos stashes e depois esquecer o que cada um tem. Sempre use 'git stash push -m "description"'.
- ✗Rodar 'git stash clear' sem perceber que ele exclui TODOS os stashes sem pedir confirmação. Só dá para recuperar vasculhando commits órfãos com 'git fsck'.
- ✗Confundir a ordem da pilha: stash@{0} é o stash MAIS recente, não o mais antigo.
Perguntas frequentes
O pop aplica o stash E o remove da pilha. O apply só aplica e mantém o stash disponível. Use apply quando talvez precise do mesmo stash em outro lugar.
Por padrão, o stash só guarda arquivos rastreados. Use 'git stash -u' para incluir arquivos não rastreados, ou 'git stash -a' para incluir também os ignorados.
Use 'git stash show' para um resumo rápido, ou 'git stash show -p' para o diff completo. Adicione stash@{n} para ver um stash específico.
Sim! Use 'git stash push -m "message" -- file1.js file2.js' para guardar só esses arquivos, ou 'git stash -p' para escolher os trechos de forma interativa.
O stash NÃO é removido quando há conflitos. Resolva os conflitos à mão e depois use 'git stash drop' para remover o stash ao terminar.
Os stashes não dependem de branch. É só fazer checkout da branch de destino e rodar 'git stash apply'. Ou use 'git stash branch <name>' para criar uma branch nova.