Desenvolvimento

3 mai, 2012

Dica Git da semana: Stashes

Publicidade

A dica Git desta semana é sobre como manter o trabalho em andamento seguro, conhecido como stashing.

Abandonar todos os bugs

Às vezes, quando você está trabalhando em um problema, é necessário deixá-lo de lado subitamente a fim de trabalhar em um diferente, como um bug crítico que foi relatado contra uma versão de produção do seu código.

Enquanto você pode facilmente criar um checkout do seu projeto com o branch específico, é mais rápido trocar branches em Git nativamente, e poupa a criação de outras ferramentas como um IDE ou um servidor de teste.

O problema é que seu trabalho pode não estar em um estado adequado para comitar no momento em que o erro aparece. Em vez de comitar em meio estado de trabalho, você, idealmente, deseja salvar o trabalho em andamento (incluindo arquivos sujos e não comitados), para te permitir mudar para a questão de maior prioridade, e retomar quando necessário.

Git Stash

É aí que o git stash vem a calhar. Isso pega uma working tree e a arquiva em um local que pode ser recuperado em um estágio posterior. O stash pode ser exibido para obter as alterações de volta como eram antes de o stash acontecer.

Para criar um stash, basta executar o comando git stash. Você pode ver que stashes estão presentes com 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 um novo stash que contém o arquivo example. Uma vez que criamos o stash, nós resetamos o commit atual (ou seja, um espaço de trabalho limpo), assim o arquivo example não está mais presente.

Podemos listar os stashes disponíveis com git stash list, que lhes confere o seu identificador (nesse caso, stash@{0}), que pode ser utilizado para identificar as alterações. (Isso padroniza para o último stash se não for especificado)

O identificador de stash também inclui o branch a partir do qual ele foi criado. É importante destacar, uma vez que o stash foi criado, aplicando-se (ou mostrando) os resultados de stash com apenas as diferenças sendo adicionadas, em vez de reiniciar de volta para um estado específico anterior. Isso permite que mudanças subsequentes sejam feitas no branch, seguidas por repetir as mudanças stash na versão atual do branch.

O Git stash pode ser usado para evitar conflitos de merge com o código de trabalho em andamento. Basta fazer stash antes de fazer um pull, e depois desfazer, como o exemplo manpage nos mostra:

$ git pull
...
file foobar not up to date, cannot merge.
$ git stash
$ git pull
$ git stash pop

Notas

  • O stash só se aplica a arquivos adicionados, não se aplica aos arquivos não monitorados. Se desejar adicionar arquivos não monitorados também, você precisa executar git add –all antes de executar a operação git stash.
  • O WIP significa Work In Progress, uma vez que não é óbvio para quem não tem o inglês como língua nativa.
  • git stash pop irá remover o stash da lista; git stash apply irá manter o stash na lista.
  • {0} representa o último stash que você fez; {1} representa do segundo ao último, e assim por diante. Essa sintaxe também aparece em outro lugar (reflogs, por exemplo).
  • Stashes individuais podem ser removidos com git stash drop, ou git stash clear para se livrar de todos eles.
  • Git stashes são armazenados como objetos de commit, mas o branch HEAD não é atualizado para apontar para eles. Em vez disso, eles são referenciados a partir de uma entrada reflog em .git/logs/refs. Você pode usar git show@{0} para ver um stash.

?

Texto original disponível em http://alblue.bandlem.com/2011/05/git-tip-of-week-stashes.html