git stash

Branches e merge

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 clear
[ ] opcional| ou<arg> valor a substituir... repetível--flag opção

Opções

Clique em uma opção para expandir

Iniciante (7)

Salvar as modificações locais em uma nova entrada do stash e voltá-las ao estado do HEAD. Use -m para adicionar uma mensagem descritiva. É a ação padrão do 'git stash'.

RecomendadoUse com -m para que cada stash possa ser identificado depois

Exemplo

git stash push -m "Work in progress"

Aplicar o stash mais recente (stash@{0}) no diretório de trabalho e removê-lo da pilha. Se a aplicação der conflito, a entrada é mantida para você resolver e excluí-la depois.

RecomendadoRestaura e remove o último stash; mantido se a aplicação der conflito

Exemplo

git stash pop

Aplicar um stash sem removê-lo da pilha. Ao contrário do pop, o stash continua disponível. Dá para indicar qual com stash@{n}.

Quando necessárioQuando você precisa do mesmo stash de novo ou em várias branches

Exemplo

git stash apply stash@{1}

Listar todas as entradas do stash. Cada entrada mostra o índice (stash@{n}), a branch em que foi criada e a mensagem ou descrição do commit.

RecomendadoConfira o que está no stash antes de fazer pop ou drop

Exemplo

git stash list

Mostrar como diff as mudanças guardadas em uma entrada do stash. Por padrão mostra stash@{0}. Adicione -p para ver o patch completo.

RecomendadoPré-visualize com -p antes de aplicar

Exemplo

git stash show -p stash@{0}

Remover uma única entrada da pilha. Sem argumentos, remove stash@{0}. Indique stash@{n} para remover outra. Anote o hash exibido - é o único jeito fácil de recuperá-la.

Quando necessárioFaça a limpeza depois do apply; anote o hash impresso caso precise dele de volta

Exemplo

git stash drop stash@{1}

Remover TODAS as entradas do stash de uma vez, sem confirmação. Só dá para recuperar caçando commits órfãos com git fsck. Use com extremo cuidado.

Não recomendadoApaga todos os stashes de uma vez, sem confirmação

Exemplo

git stash clear

Intermediário (3)

Incluir arquivos não rastreados no stash. Por padrão, o git stash só guarda arquivos rastreados. Use para guardar também arquivos novos ainda não adicionados.

RecomendadoSem ele, arquivos novos não rastreados ficam para trás

Exemplo

git stash -u

Manter a área de preparação intacta. Só as mudanças não preparadas saem do diretório de trabalho; as preparadas continuam preparadas (o stash também as registra).

Quando necessárioTestar ou registrar o trabalho preparado deixando o resto de lado

Exemplo

git stash -k

Criar uma branch nova a partir do commit em que o stash foi criado, aplicar o stash e excluí-lo se der certo. Útil quando o stash conflita com a branch atual.

Quando necessárioA melhor solução quando um stash não se aplica mais sem problemas à branch atual

Exemplo

git stash branch new-feature stash@{0}

Avançado (1)

Escolher de forma interativa os trechos a guardar no stash. Permite guardar só partes das mudanças e manter as outras no diretório de trabalho.

Quando necessárioGuardar só os hunks escolhidos

Exemplo

git stash -p

Escolhendo a opção certa

Restaurar mudanças guardadas no stash

Escolher o comando certo para restaurar o seu trabalho guardado

ComandoMantém o stash?Aplica emEm caso de conflito
git stash popNão - removido depois de aplicarBranch atualStash mantido, precisa resolver
git stash applySim - continua na pilhaBranch atualStash mantido, precisa resolver
git stash branch <name>Não - removido depois de aplicarBranch nova na base do stashSem conflitos (branch nova)

O que vai para o stash?

Controlar quais arquivos entram no stash

ComandoRastreados modificadosPreparadosNão rastreadosIgnorados
git stashSimSimNoNo
git stash -uSimSimSimNo
git stash -aSimSimSimSim
git stash -kSimSim (e também continuam preparados)NoNo

Stash e outras formas de guardar

Quando usar stash e quando usar as alternativas

ComandoOnde fica guardadoCompartilhávelIdeal para
git stashReflog localNoTroca rápida de contexto, salvamento temporário
git commit (WIP)Histórico da branchSim (se enviado)Trabalho que você talvez queira compartilhar ou consultar
git worktreeDiretório separadoN/ATrabalhar em várias branches ao mesmo tempo

Gerenciar vários stashes

Comandos para trabalhar com a pilha do stash

ComandoMostra o conteúdoModifica a pilhaCaso de uso
git stash listÍndice + mensagemNoVer todos os stashes
git stash showDiffstatNoOlhada rápida nas mudanças
git stash show -pDiff completoNoRevisão detalhada antes de aplicar
git stash dropNoSim (remove um)Excluir um stash específico
git stash clearNoSim (remove TODOS)Começar do zero (perigoso)

Exemplos

Guardar as mudanças atuais com stash

git stash

Salva 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 pop

Aplica o stash mais recente (stash@{0}) no seu diretório de trabalho e o remove da pilha.


Listar todos os stashes

git stash list

Mostra todas as entradas do stash com índice, nome da branch e mensagem. Útil para gerenciar vários stashes.

Exemplos de fluxos de trabalho

1
git stash

Guardar as mudanças atuais no stash

2
git checkout other-branch

Trocar para a outra branch

3
(do work, commit if needed)

Concluir o trabalho urgente

4
git checkout original-branch

Voltar para a sua branch

5
git stash pop

Restaurar as mudanças guardadas

1
git stash push -m "WIP: login validation"

Stash com mensagem descritiva

2
(days later...)

O tempo passa

3
git stash list

Ver todos os stashes com as mensagens

4
git stash show stash@{0}

Pré-visualizar o conteúdo do stash

5
git stash pop

Aplicar e remover quando estiver pronto

1
git stash

Guardar as suas mudanças no stash

2
git checkout branch-a

Trocar para a primeira branch

3
git stash apply

Aplicar (mantém o stash)

4
git commit -m "Add feature"

Fazer commit na branch-a

5
git checkout branch-b

Trocar para a segunda branch

6
git stash apply

Aplicar o mesmo stash de novo

7
git stash drop

Limpar ao terminar

1
git add ready-file.js

Preparar as mudanças prontas

2
git stash -k

Guardar o não preparado, manter o preparado

3
git commit -m "Ready feature"

Fazer commit das mudanças preparadas

4
git stash pop

Restaurar 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

A:

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.

A:

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.

A:

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.

A:

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.

A:

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.

A:

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.