- O problema que o stash resolve
- O básico que você provavelmente já sabe
- O que a maioria ignora: stash tem pilha
- Stash com nome: pare de adivinhar o que salvou
- Salvar só parte das mudanças
- Stash em branches diferentes
- Erros comuns que vão te custar tempo
- FAQ
- Próximos passos
O problema que o stash resolve
Você está no meio de uma feature. Arquivos modificados em três lugares, lógica pela metade, sem sentido commitar agora. Aí chega a mensagem: "consegue dar uma olhada naquele bug em produção?"
É aí que o dev inexperiente faz o commit com mensagem "wip" e o dev apressado descarta tudo. Os dois estão errados.
git stash existe exatamente para esse momento. Mas ele faz muito mais do que guardar mudanças temporariamente — e a maioria dos devs usa só 20% do que ele oferece.
O básico que você provavelmente já sabe
git stash
git stash pop
O primeiro joga suas mudanças num "armário" temporário e limpa o working directory. O segundo traz de volta. Simples.
Mas tem um detalhe que pega bastante gente no começo:
⚠️ Atenção: Por padrão,
git stashnão salva arquivos untracked — ou seja, arquivos novos que você ainda não adicionou comgit add. Para incluí-los, usegit stash -u(ou--include-untracked).
# ❌ Esquece os arquivos novos
git stash
# ✓ Salva tudo, incluindo untracked
git stash -u
Se você criou um arquivo novo e fez git stash sem o -u, abriu outro terminal e não encontrou o arquivo — esse era o motivo.
O que a maioria ignora: stash tem pilha
Cada vez que você executa git stash, o Git empilha as mudanças. É uma estrutura LIFO — o último que entrou é o primeiro a sair.
git stash list
Saída típica:
stash@{0}: WIP on feature/pagamento: 3a1b2c4 adiciona validacao de cpf
stash@{1}: WIP on feature/pagamento: 3a1b2c4 adiciona validacao de cpf
stash@{2}: WIP on main: f9e8d7c corrige typo no readme
Três stashes acumulados. git stash pop vai pegar só o {0}. Para aplicar um específico:
git stash apply stash@{2}
A diferença entre pop e apply: o pop aplica e remove da lista. O apply só aplica, mantém na pilha. Use apply quando não tiver certeza se vai funcionar — é mais seguro.
Stash com nome: pare de adivinhar o que salvou
Olhar WIP on feature/pagamento três vezes na lista não ajuda ninguém. Dê um nome descritivo:
git stash push -m "validacao de cnpj incompleta, falta regex"
Agora o git stash list fica legível:
stash@{0}: On feature/pagamento: validacao de cnpj incompleta, falta regex
stash@{1}: On main: ajuste de layout mobile sem testar no safari
Parece detalhe. Mas quando você volta depois de dois dias e tem quatro stashes na lista, a diferença é enorme. Isso apareceu num PR meu certa vez — o revisor perguntou por que eu tinha três stashes com o mesmo nome e não sabia o que cada um continha. Boa pergunta.
Salvar só parte das mudanças
Você modificou cinco arquivos, mas só quer guardar três deles no stash. Dá para fazer isso:
git stash push -m "minha descricao" -- src/components/Pagamento.tsx src/utils/cpf.ts
Ou, para uma seleção interativa (hunk a hunk, igual ao git add -p):
git stash -p
O Git vai perguntar para cada bloco de mudança se você quer incluir no stash ou não. É lento, mas preciso.
💡 Dica:
git stash -pé especialmente útil quando você misturou mudanças de duas tarefas diferentes no mesmo arquivo por descuido. Você consegue separar sem perder nada.
Stash em branches diferentes
Aqui mora um uso poderoso que pouca gente conhece: git stash branch.
Cenário: você fez um stash na main, mas ao tentar aplicar percebe que vai gerar conflito porque a branch mudou muito. Em vez de resolver conflito na mão, você cria uma branch nova direto do stash:
git stash branch feature/nova-branch stash@{0}
O que acontece:
- O Git cria a branch
feature/nova-brancha partir do commit onde o stash foi criado - Aplica as mudanças do stash automaticamente
- Remove o stash da pilha se der certo
Sem conflito. O contexto é o mesmo de quando você salvou. Isso é especialmente útil quando você percebe que o que estava fazendo merecia uma branch própria desde o início.
Erros comuns que vão te custar tempo
1. Abandonar o stash e esquecer
Devs acumulam stashes antigos e nunca limpam. Para ver o que tem:
git stash list
Para remover um stash específico:
git stash drop stash@{1}
Para limpar tudo de uma vez:
git stash clear
⚠️ Atenção:
git stash clearnão tem confirmação. Ele apaga tudo silenciosamente. Não tem undo. Use com cuidado.
2. Confundir pop com apply em situação de conflito
Se o git stash pop gerar conflito, o stash ainda é removido da pilha. Você resolve o conflito, mas o stash sumiu. Se algo der errado no processo, não tem como recuperar facilmente.
Prefira apply quando estiver inseguro. Depois que tudo estiver certo, remove manualmente com drop.
# ❌ Arriscado em situação incerta
git stash pop
# ✓ Mais seguro
git stash apply stash@{0}
# (resolve conflitos se houver)
git stash drop stash@{0}
3. Stash não salva mudanças em staged
Errado. O stash salva tanto mudanças staged quanto unstaged por padrão. Se quiser salvar só as unstaged e manter as staged intactas:
git stash --keep-index
Útil quando você quer commitar só parte e guardar o resto.
FAQ
O stash some se eu trocar de branch?
Não. O stash é global no repositório, não pertence a nenhuma branch específica. Você pode criar o stash na feature/x e aplicar na main sem problema — desde que não haja conflito.
Posso ver o diff do que está no stash antes de aplicar?
Sim. Use:
git stash show -p stash@{0}
O -p mostra o patch completo. Sem ele, você vê só o resumo de quais arquivos foram alterados.
O stash é compartilhado com o repositório remoto?
Não. O stash é local. Ninguém mais vê o que você guardou. Se você precisar compartilhar trabalho incompleto, use um commit em uma branch temporária — é mais explícito e rastreável.
Dá para recuperar um stash depois de git stash clear?
Tecnicamente sim, mas não é trivial. O Git mantém os objetos por um tempo antes do garbage collection. Você pode tentar:
git fsck --unreachable | grep commit | awk '{print $3}' | xargs git log --oneline --no-walk
Mas não conte com isso. Trate git stash clear como irreversível.
Stash funciona com submódulos?
Por padrão, não. O stash ignora mudanças em submódulos. Para incluí-los, é necessário tratar separadamente dentro de cada submódulo.
Próximos passos
Se você usava só git stash e git stash pop, agora tem pelo menos seis novos recursos para experimentar hoje:
| Comando | Quando usar |
|---|---|
git stash -u | Quando tem arquivos novos não tracked |
git stash push -m "desc" | Sempre — pare de deixar stash sem nome |
git stash list | Antes de qualquer pop com pilha acumulada |
git stash apply | Quando estiver inseguro sobre conflitos |
git stash -p | Para salvar só partes específicas do código |
git stash branch nome | Para transformar um stash em branch nova |
O stash não substitui commits, branches ou PR drafts para trabalho colaborativo. Mas para o fluxo individual, o dia a dia de interrupções e contextos trocados, ele é uma das ferramentas mais subestimadas do Git.
Use com nome. Use com intenção. Seu futuro você vai agradecer.