Início/

Git Stash

  • 24/09/2022
  • 6 min
  • Git

    Github

Você com certeza já se deparou com uma situação na qual sua responsabilidade é desenvolver/corrigir uma feature, e em algum momento surge uma urgência de última hora, em uma outra branch, mas e o seu código que ainda não está pronto para o commit, o que fazer com ele? Com essa situação em mente, o git stash vem para nos ajudar.

Git Stash

git stash arquiva (ou faz o stash) de alterações que você fez na cópia de trabalho durante um determinado período, para que você possa trabalhar em outra coisa, depois voltar e fazer a reaplicação mais tarde. O stashing é útil quando você precisa alternar com rapidez o contexto e trabalhar em outra coisa, mas está no meio da alteração de código e não está pronto para fazer commit.

Com o git stash é possível “salvar” suas alterações sem precisar realizar um commit (Lembrando que arquivos preparados e não preparados são incluídos no stash) para você utilizar em algum outro momento.

Criando um Stashes

Digamos que você realizou parte da sua task no arquivo index.html e criou o styles.css, porém foi pedido para você realizar uma correção em uma outra branch, podemos então criar o nosso primeiro Stash.

Antes do stash, podemos ver o status dos nossos arquivos:

$ git status
	
	Changes not staged for commit:
	        modified: index.html
	
	Untracked files:
	        new file: styles.css

Podemos ver que existe o index.html como modified e o nosso styles.css como new file, agora criaremos o nosso Stash:

$ git stash

Saved working directory and index state WIP on main: fe442e6 Delete comments on index.html

E rodando novamente o git status, ele nos mostra que não existe alterações/criações.

$ git status

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Nesse momento, você pode realizar alteração, criar novos commits, alternar branchs e executar quaisquer outras operações do Git. Quando estiver satisfeito, poderá “trazer” de volta o seu stash, explicarei mais a frente como realizar o git stash pop.

Lembrando que o stash só existe no local, e stashes não são enviados para o servidor remoto quando você realizar o push.

Trazendo as alterações com o pop

Nesse momento você já finalizou o que tinha que fazer em alguma outra ramificação do projeto, e está pronto para dar continuidade a sua antiga task, agora iremos ver como aplicar as alterações existentes no stash utilizando o git stash pop

Executamos o status para visualizarmos as alterações existentes:

$ git status

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

E agora trazemos as alterações utilizando o pop:

$ git stash pop
On branch main

Changes not staged for commit:
        modified:   index.html

Untracked files:
        new file: styles.css

Dropped refs/stash@{0} (04aa236313d158de0edbf4a9d50e84ed7c23b92c)

Executar o pop no stash aplica as alterações no projeto e as remove.

Uma outra flag interessante nesse sentido é o apply que irá aplicar as alterações, porém o stash ainda vai existir, caso você queria aplicar em alguma outra branch:

$ git stash apply
On branch main
Changes to be committed:

    new file:   style.css

Changes not staged for commit:

    modified:   index.html

Por padrão, o Git não vai fazer o stash de alterações feitas a arquivos ignorados ou não rastreados.

Gerenciar múltiplos stashes

Importante destacar, que você não fica limitado a apenas um único stash, você é capaz de criar múltiplos stathes. Sendo possivel visualizar todos os stashes criados utilizando a flag list:

$ git stash list
stash@{0}: WIP on main: 5002d47 our new homepage
stash@{1}: WIP on main: 5002d47 our new homepage
stash@{2}: WIP on main: 5002d47 our new homepage

Por padrão, os stashes são nomeados com "WIP" — Work in Progress (Trabalho em progresso), Branch e Commit que foi criado.

Uma boa prática existente para você criar os seus stashes a longo prazo sem se perder, ou ficar totalmente confuso, é a flag save ela permite nós passarmos uma string que seria o nome/descrição daquele stash.

$ git stash save "add style to our site"
Saved working directory and index state On main: add style to our site
HEAD is now at 5002d47 our new homepage

$ git stash list
stash@{0}: On main: add style to our site
stash@{1}: WIP on main: 5002d47 our new homepage
stash@{2}: WIP on main: 5002d47 our new homepage

Por padrão, git stash pop vai trazer o stash mais recente: stash@{0}

Podemos escolher qual stash aplicar, utilizando o seu identificador (stash@{number}):

$ git stash pop stash@{2}

Limpar seu stash

Se em determinado momento você decidir que um stash não será mais necessário, é possível excluir um ou mais stashes:

Para apagar um stash isolado:

$ git stash drop stash@{1}
Dropped stash@{1} (17e2697fd8251df6163117cb3d58c1f62a5e7cdb)

Ou você pode excluir todos:

$ git stash clear

Visualizar comparações de stash

Imagine uma situação onde você tem alguns stashes criados, e não se lembra o que tem exatamente naquele primeiro stash criado, para isso temos a flag show , vale lembrar que ele sempre vai mostrar por padrão o stash mais recente (stash@{0}):

$ git stash show
 index.html | 1 +
 style.css | 3 +++
 2 files changed, 4 insertions(+)

Para visualizar um stash em especifico, basta passar o identificador dele:

$ git stash show *stash@{0}*
 index.html | 3 +++
 style.css | 1 +
 2 files changed, 4 insertions(+)

Lembrando que ele mostra de uma forma resumida, podemos utilizar o -p (ou --patch) para uma inspeção mais detalhada.

Fazer stash em arquivos ignorados ou não rastreados

Um problema (ou não), é que o stash não irá ser aplicado em arquivos não rastreados (Arquivos criados que não passaram por nenhum commit), para resolver essa questão, podemos adicionar a flag -u (ou --include-untracked).

Você também pode incluir alterações para arquivos ignorados (Dentro do .gitignore), passando a flag -a ou --all).

Fonte:

https://git-scm.com/docs/git-stash

https://www.atlassian.com/br/git/tutorials/saving-changes/git-stash