O que é Git Stash?
Você está no meio do desenvolvimento de uma funcionalidade quando algo urgente aparece. Um bug precisa ser corrigido na branch principal, ou um colega precisa que você revise a pull request dele. Você não está pronto para fazer commit do seu trabalho em andamento, mas não pode trocar de branch com alterações não commitadas no seu diretório de trabalho. Este é exatamente o problema que o git stash foi criado para resolver.
Git stash pega suas alterações não commitadas -- tanto as em staging quanto as que não estão -- e as salva em uma área de armazenamento temporário. Seu diretório de trabalho volta a um estado limpo, correspondendo ao último commit. Quando você estiver pronto, pode trazer essas alterações de volta. Pense nisso como colocar seu trabalho em uma prateleira para lidar com outra coisa, e depois retomá-lo exatamente de onde parou.
Uso básico: Stash, Apply e Pop
Salvando alterações no stash
A forma mais simples é:
git stash
Isso pega todos os arquivos rastreados, modificados e em staging e os armazena. Seu diretório de trabalho fica limpo. Note que arquivos não rastreados (arquivos que você nunca adicionou ao Git) não são incluídos no stash por padrão. Para incluí-los, use:
git stash -u
Ou para incluir tudo, até mesmo arquivos ignorados:
git stash -a
Recuperando alterações com apply
Depois de terminar sua tarefa secundária e querer seu trabalho do stash de volta, use:
git stash apply
Isso restaura as alterações do stash no seu diretório de trabalho, mas mantém a entrada do stash intacta. O stash ainda está na prateleira, o que pode ser útil se você quiser aplicar as mesmas alterações em várias branches.
Recuperando alterações com pop
git stash pop
Pop funciona como apply, mas também remove a entrada do stash depois de aplicá-la. Esta é a escolha mais comum quando você simplesmente quer seu trabalho de volta e não precisa manter o stash.
A diferença principal: apply mantém o stash, pop o exclui após restaurar. Use apply quando você pode precisar do stash novamente. Use pop quando tiver terminado com ele.
Adicionando uma mensagem ao seu stash
Por padrão, Git rotula os stashes com uma descrição gerada automaticamente como WIP on main: a3b4c5d commit message. Isso não é muito útil quando você tem vários stashes. Você pode adicionar uma mensagem descritiva:
git stash push -m "refactoring the auth module"
Isso torna muito mais fácil identificar o que cada stash contém quando você os lista depois.
Gerenciando múltiplos stashes
Listando seus stashes
Git mantém uma pilha de stashes. Você pode ver todos com:
git stash list
A saída se parece com isto:
stash@{0}: On main: refactoring the auth module
stash@{1}: WIP on feature/checkout: 9f2e1d0 add cart logic
stash@{2}: WIP on main: 7c8d9e1 update dependencies
O stash mais recente é sempre stash@{0}. Cada novo stash empurra os mais antigos para baixo na pilha.
Aplicando ou fazendo pop de um stash específico
Por padrão, apply e pop operam sobre o stash mais recente. Para apontar para um específico, referencie-o pelo seu índice:
git stash apply stash@{2}
git stash pop stash@{1}
Vendo o conteúdo de um stash
Antes de aplicar um stash, você pode querer ver o que está dentro dele:
git stash show stash@{0}
Isso mostra um resumo dos arquivos alterados. Para o diff completo, adicione -p:
git stash show -p stash@{0}
Fazendo stash de arquivos específicos
Às vezes você não quer fazer stash de tudo. Talvez você só queira guardar as alterações de um ou dois arquivos. Desde o Git 2.13, você pode fazer isso com:
git stash push -m "sidebar layout changes" src/components/Sidebar.tsx src/styles/sidebar.css
Apenas os arquivos especificados são colocados no stash. Todo o resto permanece no seu diretório de trabalho.
Removendo e limpando stashes
Removendo um único stash
Se você não precisa mais de um stash específico, remova-o com:
git stash drop stash@{1}
Isso exclui essa entrada do stash. Os stashes restantes são reindexados automaticamente.
Limpando todos os stashes
Para remover todos os stashes de uma vez:
git stash clear
Tenha cuidado com isso. Não há como desfazer. Todas as alterações em stash são excluídas permanentemente.
Criando uma branch a partir de um stash
Às vezes você faz stash de alterações e depois percebe que elas merecem sua própria branch. Em vez de aplicar o stash e depois criar uma branch, Git oferece um atalho:
git stash branch new-feature-branch stash@{0}
Isso cria uma nova branch a partir do commit onde o stash foi originalmente criado, aplica o stash e o remove. É especialmente útil quando aplicar o stash na sua branch atual causaria conflitos.
Armadilhas comuns
- Esquecer dos stashes. Stashes são fáceis de esquecer. Execute
git stash listperiodicamente para verificar se você tem stashes pendentes que deveriam ser aplicados ou removidos. - Conflitos de stash. Se o código mudou significativamente desde que você fez o stash, aplicá-lo pode produzir conflitos de merge. Resolva-os da mesma maneira que resolveria qualquer conflito de merge.
- Depender do stash em vez de commits. Se você se encontra fazendo stash frequentemente, considere fazer commit do seu trabalho em andamento. Você sempre pode fazer amend ou squash desses commits depois. O stash é melhor para trocas de contexto rápidas e de curta duração, não para armazenamento de longo prazo.
Trabalhando com stashes no GitSquid
GitSquid exibe stashes diretamente no grafo de commits, para que você possa ver rapidamente quais stashes existem e de qual commit foram criados. Clicar com o botão direito em um stash abre um menu de contexto com opções para apply, pop, drop ou limpar todos os stashes. Isso torna o gerenciamento de stashes mais rápido do que digitar comandos, especialmente quando você tem múltiplos stashes e precisa inspecioná-los ou limpá-los.
Referência rápida
| Comando | O que faz |
|---|---|
git stash |
Faz stash das alterações rastreadas |
git stash -u |
Stash incluindo arquivos não rastreados |
git stash push -m "msg" |
Stash com mensagem descritiva |
git stash list |
Lista todos os stashes |
git stash apply |
Restaura o stash, mantém a entrada |
git stash pop |
Restaura o stash, exclui a entrada |
git stash drop stash@{n} |
Exclui um stash específico |
git stash clear |
Exclui todos os stashes |
git stash show -p |
Mostra o diff completo de um stash |
git stash branch <name> |
Cria uma branch a partir de um stash |
Git stash é uma daquelas ferramentas que parecem menores até você precisar dela. Uma vez que se sinta confortável com ela, trocar de contexto entre tarefas se torna fluido. Mantenha seus stashes organizados com mensagens, limpe os antigos regularmente e use pop em vez de apply quando não precisar manter o stash.