W3docs

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.

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 status
On branch master
Changes to be committed:
  new file:   style.css
Changes not staged for commit:
  modified:   index.html

Guardar as alterações no stash

git stash
Saved working directory and index state WIP on master: 5002d47 our new homepage
HEAD is now at 5002d47 our new homepage

Confirmar que a árvore de trabalho está limpa

git status
On branch master
nothing to commit, working tree clean

Suas 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 pop reaplica o stash mais recente à sua cópia de trabalho e o remove da lista de stashes.
  • git stash apply reaplica 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 pop
On 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.

Nota

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 -u

Para guardar também arquivos ignorados, use a opção -a (ou --all):

Incluir arquivos não rastreados e ignorados

git stash -a

Arquivos 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-index

Isso é ú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 list
stash@{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 -p
diff --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 -p
diff --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,?]? n

Comandos de hunk

ComandoDescrição
/Pesquisar um hunk por expressão regular.
?Exibir ajuda.
nNão guardar o hunk.
aGuardar este hunk e todos os hunks posteriores no arquivo.
dNão guardar este hunk nem nenhum dos hunks posteriores no arquivo.
eEditar manualmente o hunk atual.
qSair (os hunks selecionados serão guardados).
sDividir o hunk em hunks menores.
yGuardar 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 clear
Aviso

git 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

ComandoO que faz
git stashGuarda alterações staged e unstaged em arquivos rastreados.
git stash -uTambém guarda arquivos não rastreados.
git stash -aTambém guarda arquivos não rastreados e ignorados.
git stash --keep-indexGuarda 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 listLista todos os stashes (o mais recente é stash@{0}).
git stash show -pExibe o diff completo de um stash.
git stash popReaplica o stash mais recente e o remove.
git stash applyReaplica 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 / clearExclui um / todos os stashes.

Para aprender outras formas de mover e desfazer trabalho, veja git reset, git restore e git checkout.

Prática

Prática
Quais são as funcionalidades do comando 'git stash'?
Quais são as funcionalidades do comando 'git stash'?
Was this page helpful?