Usando git stash e git stash pop
Mudar de branches durante o meio de trabalho é algo que acontece com certa frequência, por exemplo, para resolver um bug fazendo um “hotfix” em um outro branch enquanto você está desenvolvendo uma tarefa.
Existem algumas formas de interromper o trabalho, incluindo fazer commits. A minha forma favorita é usando os comandos git stash
e git stash pop
. Muitas pessoas confundem o funcionamento desses dois comandos, então vamos resolver isso. 😉
O que é o stash
Stash pode ser visto com um empacotamento das mudanças atuais, que ainda não foram feitas o commit, que fica salvo localmente no seu computador numa pilha. Cada pacote de mudanças é chamado de stash.
Quando um stash é criado, o seu diretório volta a um estado limpo, ou seja, sem mudanças nos arquivos que são acompanhados pelo Git. Isso também quer dizer que arquivos novos, que ainda não foram adicionados em um commit, não são adicionados em stash.
Cada stash recebe um “nome”, um índice, no formato stash@{<n>}
, onde "n"
se refere a um número correspondente a localização do stash na pilha de stashes. Esse número sempre se altera se mais stashes forem adicionados a pilha, o stash mais recente sempre é o stash@{0}
.
Pilhas, são um conceito comum em programação, e isso é importante para entender o comportamento do stash, pois, sem indicar o índice do stash, os comandos vão seguir a ordem LIFO (“last in, first out”), onde o último stash, ou seja, o stash mais recente, a ser adicionado na pilha é removido primeiro.
Guardando trabalho em progresso com stash
Então vamos dizer que você está trabalhando no branch tarefa
que corresponde a implementação de uma feature qualquer, mas agora você precisa voltar para o branch main
e resolver um problema muito importante, por questões de simplicidade não vamos focar na resolução de problemas. Esse é o estado corrente do seu trabalho:
Agora você precisa salvar o trabalho que você já fez antes de retornar ao branch main
. Para isso use o comando a seguir:
git stash
Esse comando é um atalho para o comando completo, o git stash push
. Agora que o stash foi feito, você vai ver um resultado semelhante ao seguinte:
Você também pode ver o stash que acabou de fazer usando o comando git stash list
para ver a lista de stashes existentes:
Note na imagem acima que a listagem de stashes sempre apresenta o índice do stash e uma mensagem. Agora que o trabalho está salvo, você pode trocar de branch tranquilamente e resolver o que precisar. Vale salientar que stashes não são amarrados a um branch, então você ainda vai poder ver o seu stash na lista mesmo depois de trocar de branches.
Voltando a trabalhar com o pop
Depois de terminar os ajustes no branch main
, você finalmente pode voltar a trabalhar naquela feature do branch tarefa
. Para tirar o stash da pilha e aplicar as mudanças que você guardou, use o comando a seguir:
git stash pop
O pop
vai remover o stash mais recente da pilha e aplicar as mudanças que ele contém, e você deve ver um resultado parecido com isso:
Agora você tem tudo que precisa pra continuar seu trabalho.
Como adicionar um arquivo novo à um stash
Como falei anteriormente, arquivos novos não entram num stash, isso acontece por que eles não possuem rastreamento anterior. Por exemplo, digamos que enquanto estivesse trabalhando no branch tarefa
, você, além de modificar o arquivo arquivo-tarefa.txt
, você tenha criado o arquivo arquivo-2.txt
, de deixando com o resultado a seguir no seu diretório de trabalho:
Se você tentar fazer o stash dessas alterações, vai ver que o arquivo novo continua lá firme e forte:
E aí você deve estar se perguntando, já que o stash não leva em consideração arquivos novos, como a gente burla esse comportamento? E a boa notícia é que existe um truque para adicionar arquivos novos à um stash: você precisa adicionar eles em staging!
Então adicione o arquivo novo com git add
e você terá uma situação assim:
E se você fizer novamente o git stash
verá que agora seu stash guarda também o arquivo novo e como resultado você tem o seu diretório de trabalho limpo:
E já que você sabe aplicar um stash e remover ele da lista com o git stash pop
, você vai ver que o arquivo novo também volta do stash em staging:
E agora você já sabe usar git stash
. 🎉
GitFichas
Espero que esses comandos te ajudem a interromper o trabalho feito e voltar a trabalhar nas mudanças.