Git Stash - Git e Github
Tags: git, github, programming, braziliandevs
Published: 2022-10-01 00:37:08

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:

```bash
$ 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:

```bash
$ 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.

```bash
$ 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:
```bash
$ 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:
```bash
$ 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:

```bash
$ 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:

```bash
$ 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.

```bash
$ 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}):
```bash
$ 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:

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

Ou você pode excluir todos:
```bash
$ 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}):

```bash
$ 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:
```bash
$ 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).

![Stash](https://user-images.githubusercontent.com/69824782/193376187-74f6577a-a6ff-447f-bdb7-454bd0f2677a.png)

Fonte:

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

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