← Voltar ao blog

Git stash explicado: save, apply, pop e drop

tutorial git

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 list periodicamente 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.