git stash
Informações sobre o comando git stash, como guardar seu trabalho, trabalhar com múltiplos stashes e stashes parciais.
O que o git stash faz
O comando git stash arquiva as alterações que você fez em sua cópia de trabalho para que você possa trabalhar em outra coisa e depois voltar e reaplicá-las. É a resposta para uma situação muito comum: você está no meio de uma alteração quando precisa trocar de branch, buscar atualizações ou corrigir um bug urgente — mas seu trabalho ainda não está pronto para ser commitado. Em vez de fazer um commit provisório, você guarda as alterações no stash, obtém uma árvore de trabalho limpa, realiza o outro trabalho e restaura suas alterações depois.
Um stash é armazenado como um objeto especial semelhante a um commit em uma pilha LIFO (último a entrar, primeiro a sair). Cada entrada contém um instantâneo dos seus arquivos rastreados modificados e, por padrão, o Git deixa seu diretório de trabalho limpo após a criação do stash.

Esta página aborda como guardar e restaurar alterações, incluindo arquivos não rastreados e ignorados, como trabalhar com múltiplos stashes, inspecionar e fazer stashes parciais, criar branches a partir de um stash e limpar stashes. Para uma revisão sobre alterações staged versus unstaged, veja git add e git status.
Guardando seu trabalho no stash
O comando git stash captura as alterações staged e unstaged não commitadas de arquivos rastreados, salva-as para uso posterior e as remove da sua cópia de trabalho. Primeiro, execute git status para ver o estado atual. Em seguida, execute git stash para guardar as alterações:
Verificar o estado da árvore de trabalho
git statusOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.htmlGuardar as alterações no stash
git stashSaved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepageConfirmar que a árvore de trabalho está limpa
git statusOn branch master
nothing to commit, working tree cleanSuas alterações estão armazenadas com segurança e seu diretório de trabalho corresponde ao último commit, portanto você pode trocar de branch ou buscar atualizações livremente.
Reaplicando suas alterações do stash
Existem dois comandos para restaurar um stash, e a diferença é importante:
git stash popreaplica o stash mais recente à sua cópia de trabalho e o remove da lista de stashes.git stash applyreaplica as alterações, mas as mantém na lista de stashes, o que é útil quando você deseja aplicar o mesmo stash em mais de um branch.
Aplicar o stash mais recente e descartá-lo
git stash popOn branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)A linha Dropped refs/stash@{0} confirma que a entrada foi removida após um pop bem-sucedido.
Se reaplicar um stash gerar conflitos de merge (porque os arquivos subjacentes foram alterados nesse intervalo), o git stash pop não descartará o stash — ele deixará os marcadores de conflito para você resolver e manterá a entrada para que você não perca seu trabalho. Resolva os conflitos e remova-o manualmente com git stash drop.
Guardando arquivos não rastreados ou ignorados
Por padrão, o git stash armazena apenas alterações que o Git já está rastreando: alterações staged e modificações em arquivos rastreados. Ele não guardará arquivos completamente novos que nunca foram staged, nem arquivos ignorados. Para incluir arquivos não rastreados, use a opção -u (ou --include-untracked):
Incluir arquivos não rastreados
git stash -uPara guardar também arquivos ignorados, use a opção -a (ou --all):
Incluir arquivos não rastreados e ignorados
git stash -aArquivos correspondidos pelo seu .gitignore só são guardados quando você passa -a. Use com moderação — isso pode capturar artefatos de build e configurações locais que você provavelmente não pretendia mover.
Mantendo alterações staged com --keep-index
Quando você quer testar apenas suas alterações staged de forma isolada, o git stash --keep-index guarda tudo, mas deixa o conteúdo do índice na sua árvore de trabalho:
Guardar tudo, mas manter o que está staged
git stash --keep-indexIsso é útil antes de commitar: guarde o trabalho unstaged no stash, execute seus testes exatamente com o que você está prestes a commitar e depois use git stash pop para trazer o restante de volta.
Múltiplos stashes
Você pode executar git stash várias vezes para criar múltiplos stashes e depois executar git stash list para visualizá-los. Por padrão, cada stash é rotulado como "WIP" — trabalho em andamento — junto com o branch e o commit a partir do qual foi criado. O stash mais recente é stash@{0}; os mais antigos têm índices mais altos.
Listar os stashes
git stash liststash@{0}: WIP on master: 5002d47 our new homepage
stash@{1}: WIP on master: 049d078 add navigation
stash@{2}: WIP on master: 38e3b29 initial layoutÉ uma boa prática adicionar uma mensagem descritiva em vez do rótulo padrão "WIP" para que você possa distinguir os stashes mais tarde:
Guardar no stash com uma mensagem
git stash push -m "wip: experimental dark theme"Por padrão, o git stash pop reaplica o stash mais recente, stash@{0}. Você pode direcionar um stash específico passando sua referência para pop ou apply:
Aplicar um stash específico
git stash pop stash@{2}On branch master
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{2} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Visualizando diffs de stashes
Use git stash show para ver um resumo dos arquivos que um stash modificou:
Resumo de um stash
git stash show index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions(+)Por padrão, git stash show reporta o stash mais recente. Passe uma referência como git stash show stash@{1} para inspecionar um mais antigo. Adicione a opção -p ou --patch para ver o diff completo:
Diff completo de um stash
git stash show -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>Stashes parciais
O Git permite que você escolha se deseja guardar um único arquivo, um grupo de arquivos ou alterações individuais dentro dos arquivos. O comando git stash -p (ou --patch) itera por cada hunk — um trecho contíguo de alteração — na cópia de trabalho e pergunta se você deseja guardá-lo:
Guardar hunks selecionados de forma interativa
git stash -pdiff --git a/style.css b/style.css
new file mode 100644
index 0000000..d92368b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3 @@
+* {
+ text-decoration: blink;
+}
Stash this hunk [y,n,q,a,d,/,e,?]? y
diff --git a/index.html b/index.html
index 9daeafb..ebdcbd2 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,2 @@
+<link rel="stylesheet" href="style.css"/>
Stash this hunk [y,n,q,a,d,/,e,?]? nComandos de hunk
| Comando | Descrição |
|---|---|
| / | Pesquisar um hunk por expressão regular. |
| ? | Exibir ajuda. |
| n | Não guardar o hunk. |
| a | Guardar este hunk e todos os hunks posteriores no arquivo. |
| d | Não guardar este hunk nem nenhum dos hunks posteriores no arquivo. |
| e | Editar manualmente o hunk atual. |
| q | Sair (os hunks selecionados serão guardados). |
| s | Dividir o hunk em hunks menores. |
| y | Guardar o hunk. |
Criando um branch a partir de um stash
Às vezes, o commit a partir do qual você criou o stash avançou tanto que reaplicar o stash causaria conflitos. O git stash branch resolve isso criando um novo branch a partir do commit em que o stash foi originalmente criado, aplicando o stash lá e descartando-o em caso de sucesso:
Criar um branch a partir de um stash
git stash branch add-stylesheet stash@{1}Switched to a new branch 'add-stylesheet'
On branch add-stylesheet
Changes to be committed:
new file: style.css
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{1} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)Limpando o stash
Os stashes não são removidos automaticamente, portanto a lista pode crescer ao longo do tempo. Exclua um único stash com git stash drop:
Remover um stash
git stash drop stash@{1}Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)Para excluir todos os stashes de uma vez, use git stash clear:
Remover todos os stashes
git stash cleargit stash clear e git stash drop descartam as alterações guardadas permanentemente e elas não fazem parte de nenhum branch, portanto um git log normal não as exibirá. Se você excluir um stash por engano, ainda poderá recuperar o objeto através do git reflog e do git stash apply <commit-hash> antes que a coleta de lixo o remova.
Referência rápida de comandos
| Comando | O que faz |
|---|---|
git stash | Guarda alterações staged e unstaged em arquivos rastreados. |
git stash -u | Também guarda arquivos não rastreados. |
git stash -a | Também guarda arquivos não rastreados e ignorados. |
git stash --keep-index | Guarda no stash, mas mantém as alterações staged na árvore de trabalho. |
git stash push -m "message" | Guarda no stash com um rótulo descritivo. |
git stash list | Lista todos os stashes (o mais recente é stash@{0}). |
git stash show -p | Exibe o diff completo de um stash. |
git stash pop | Reaplica o stash mais recente e o remove. |
git stash apply | Reaplica o stash mais recente e o mantém. |
git stash branch <name> | Cria um branch a partir de um stash e o aplica. |
git stash drop / clear | Exclui um / todos os stashes. |
Para aprender outras formas de mover e desfazer trabalho, veja git reset, git restore e git checkout.