Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIntermediáriocódigo testado

git stash: guardar mudanças sem fazer commit

Como guardar o trabalho pela metade para atender um chamado urgente, recuperar com pop ou apply, nomear o stash e resolver conflito na hora de aplicar.

Rodolfo Mori4 min de leitura

git stash guarda temporariamente mudanças rastreadas e devolve a working tree ao commit atual. Ele serve para interromper uma tarefa por pouco tempo, trocar de branch e voltar. Não é backup remoto, não substitui commit e não inclui arquivos novos por padrão.

No laboratório, o catálogo recebeu um livro ainda sem commit. O status antes de guardar era:

bash
git status --short
M catalogo.txt

Uma urgência não precisa virar commit sem sentido

Imagine um chamado para corrigir o frete na main enquanto a busca está pela metade. Comitar “WIP” na branch errada polui o histórico; descartar perde trabalho. O stash cria uma entrada local e restaura a base:

bash
git stash push -m "adiciona Refatoração"
Saved working directory and index state On main: adiciona Refatoração

Pense num armário de curta permanência. Você coloca a bancada em um pacote nomeado e recupera depois. O limite é que o armário mora só nesse repositório e pode conflitar com mudanças futuras; não é um lugar durável para semanas de trabalho.

bash
git status --short

git status --short não escreveu nada depois da aplicação: a working tree voltou ao estado do commit atual.

Dê nomes que sobrevivam à interrupção

Três entradas nomeadas ficaram ordenadas da mais recente para a mais antiga:

bash
git stash list
stash@{0}: On main: anota revisão de preços stash@{1}: On main: adiciona DDD stash@{2}: On main: adiciona Refatoração

stash@{0} muda quando outra entrada chega. O texto depois de -m permite reconhecer intenção sem abrir todos os patches. Para scripts, capture a referência com cuidado ou use os subcomandos adequados; não suponha que o índice de ontem continua igual.

Show revela o patch guardado

Antes de aplicar, leia a entrada:

bash
git --no-pager stash show -p stash@{1}
diff --git a/catalogo.txt b/catalogo.txt index a352911..64cae81 100644 --- a/catalogo.txt +++ b/catalogo.txt @@ -1 +1,2 @@ Clean Code | 89.90 +Domain-Driven Design | 129.90

O patch mostra contexto e linha adicionada. Sem -p, show exibe um resumo. Esse passo evita aplicar a entrada errada sobre uma tarefa urgente.

Arquivo novo exige a opção u

Por padrão, arquivos untracked não entram. No sandbox, notas.txt precisou de -u, forma curta de --include-untracked:

bash
git stash push -u -m "anota revisão de preços"
Saved working directory and index state On main: anota revisão de preços

Arquivos ignorados continuam de fora; existe --all, mas guardar dependências e builds pode ser caro e esconder uma política ruim de ignore. Antes, confira como funciona .gitignore.

Pop aplica e remove; apply só aplica

git stash apply stash@{1} tenta aplicar e mantém a entrada, útil quando você quer testar ou reutilizar. pop tenta aplicar e remove apenas quando a operação consegue completar. Comece com working tree limpa e confirme a referência. Se usar apply, faça commit do resultado e então remova a entrada com drop.

O stage guardado pode ser restaurado com --index, mas isso aumenta a chance de conflito quando a base mudou. Comece recuperando conteúdo e revise o status; preservar exatamente a seleção antiga só é útil quando ela ainda representa a mesma decisão.

Um pop com conflito preserva a entrada

O sandbox mudou o preço de Clean Code num commit e tentou aplicar um stash que alterava a mesma região:

bash
git stash pop stash@{1}
Auto-merging catalogo.txt CONFLICT (content): Merge conflict in catalogo.txt On branch main Unmerged paths: both modified: catalogo.txt

The stash entry is kept in case you need it again.

A última frase é a proteção importante: como o pop falhou, a entrada ficou na pilha. A lista depois do conflito confirmou:

bash
git stash list
stash@{0}: On main: adiciona DDD stash@{1}: On main: adiciona Refatoração

Resolva os marcadores como em git merge, teste e faça commit. Depois apague o stash apenas se a resolução preservou o trabalho. A entrada não some automaticamente quando o pop conflita justamente para você não perder a única referência ao patch.

Stash também pode esconder dívida

Uma entrada de algumas horas é ferramenta. Dez entradas antigas sem nome são um inventário de decisões adiadas. Para trabalho que precisa sobreviver, prefira uma branch e um commit de rascunho claramente identificado; assim há histórico, push e possibilidade de colaboração.

Depois de confirmar o conteúdo de uma entrada antiga, o descarte real foi:

bash
git stash drop stash@{1}
Dropped stash@{1} (c99923c22b348a5e115dc5789bf1be1442796bc2)

Drop remove a referência, portanto não é o primeiro passo de diagnóstico. O hash exibido pertence ao sandbox; na sua execução, copie a referência mostrada por git stash list, não este identificador.

Organize a volta antes de abrir outra urgência

Ao terminar o chamado, volte à branch original, confirme working tree limpa e inspecione o stash antes de aplicar. Depois da recuperação, rode os testes que faziam sentido na base antiga e os que protegem mudanças que chegaram durante a interrupção. Um patch válido ontem pode violar uma regra adicionada hoje.

Se o stash produz conflito, não tente aplicar outras entradas por cima. Resolva ou aborte o estado atual, confira o índice e só então avance. Empilhar conflitos transforma um mecanismo temporário em recuperação forense desnecessária.

Sua missão é empilhar três stashes nomeados, incluindo um arquivo novo com -u, inspecionar o segundo e recuperar com apply. Termine quando a lista explicar sozinha cada intenção e você souber quando escolher uma branch de tarefa no lugar do armário temporário. No fluxo de equipe, commits compartilháveis são preferíveis a trabalho que existe apenas na sua máquina.

  • git
  • stash
  • branch
  • workflow

Perguntas frequentes

stash vai para o GitHub quando faço push?
Não. As entradas ficam nas referências locais do repositório. Para compartilhar trabalho, faça um commit numa branch apropriada e envie a branch.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em git version 2.54.0 (Apple Git-156) no macOS 27, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. Git — git stash — git-scm.com
  2. Pro Git — Stash e limpeza — git-scm.com

Continue por aqui