Às vezes, acontece de você estar trabalhando em um problema e ter que largá-lo para focar em um outro, como um bug crítico que foi reportado contra a versão de produção do seu código. Você poderia, facilmente, criar um novo checkout do seu projeto com um branch especifico, mas é mais rápido trocar de branches no Git nativamente, e ao invés de ter que configurar outras ferramentas, como o IDE, ou um servidor de teste.
O problema é que o seu trabalho pode não estar em um estado ideal para realizar o commit na hora em que o bug aparece. Ao invés de de fazer o commit só na metade do seu trabalho, o ideal seria você salvar o trabalho em progresso (incluindo arquivos feios e nos quais não foram realizado o commit). Assim, você já estaria livre para trabalhar no problema de maior prioridade.
E é exatamente nessa parte que o git stash se torna útil. Ele pega uma árvore que funcione e a arquiva em um local do qual possam ser recuperados mais tarde. O stash pode, então, ser aberto para obter as mudanças de volta, como elas eram antes do stash acontecer.
Para criar um stash, apenas execute o comando git stash. Você pode ver quais stahes estão presentes com uma git list:
$ git stash list
$ touch example
$ git add example
$ git stash
Saved working directory and index state WIP on master: dc3ea83
HEAD is now at dc3ea83
$ git stash list
stash@{0}: WIP on master: dc3ea83
$ ls example
$ # do emergency bugfix here, and afterwards
$ git stash pop # or git stash apply
$ ls example
example
Aqui criamos uma nova stash que continha o arquivo de exemplo. Uma vez que acabamos com o stash, nós resetamos o commit atual (por exemplo o clean worskpace), de modo que o arquivo de exemplo não está mais presente.
Podemos listar os stashes disponíveis com uma git stash list, o que dá a eles seu identificador (neste caso, stash@{0}) que pode ser usado para identificar as mudanças. Por padrão é a última stash, caso não esteja especificado.
O identificador de stash também inclui a informação de a partir de qual branch o stash foi criado. É importante notar que uma vez que o stash foi criado, os resultados do stash devem ser aplicados (ou disparados – “popping”) apenas nas diferenças que foram adicionadas, ao invés de resetá-los a um estado anterior. Isto permite que mudanças subsequentes sejam feitas na versão atual do branch em um momento posterior.
O git stash pode ser usado para evitar conflitos de mesclagem com o código em andamento. Uma stash simples antes de fazer um pull e e desfazer a stash depois, como mostra o exemplo:
$ git pull
...
file foobar not up to date, cannot merge.
$ git stash
$ git pull
$ git stash pop
Notas
- O stash somente pode ser aplicado a arquivos adicionados; ele não é aplicado em arquivos não rastreáveis. Se você quiser adicionar arquivos não rastreáveis também, você precisa executar git add – tudo antes de executar a operação git stash.
- O git stash pop irá remover o stash da lista; o git stash apply irá manter o stash na lista.
- O {0} representa o último stash que você fez, o {1} representa o penúltimo e assim por diante. A sintaxe também aparece em outro lugar, como os reflogs.
- Stashes individuais podem ser removidas com o git stash drop, ou com o git stash clear, para se livrar de todos eles.
- Os git stashes são armazenados como objetos commit, mas o branch HEAD não está atualizado para apontá-los. Ao invés disso, eles são referenciados a partir de uma entrada do reflog em .git/logs/refs. Você pode usar git show stash@{0} para ver um stash.
***
Texto original disponível em: http://alblue.bandlem.com/2011/05/git-tip-of-week-stashes.html