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