Na série que fiz sobre Git um tempo atrás (Links no fim do post), não falei sobre um dos comando mais interessantes. Me refiro o git stash.
Este comando é uma mão na roda. Sabe quando você está trabalhando em uma história complexa e código está confuso, do nada aparece um bug para você resolver? O que fazer? Você precisa mudar de branch, mas não pode fazer isso, pois as alterações não podem ser comitadas, ainda não está finalizada.
São nesses momentos que o stash resolver seu problema. Ao fazer um stash, você retira toda a “sujeira” do seu diretório de trabalho e “varre para de baixo do tapete”, põem em uma pilha de modificações. Isto possibilita mudar de branch, correção de bug e em momento oportuno, retirar as alterações da pilha e terminar implementação do que foi pausado.
Fazendo stash
Altere alguns arquivos de seu projeto, depois execute o comando git status.
$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test/br/com/ederleite/codekata/domino/service/testTable.txt no changes added to commit (use "git add" and/or "git commit -a")
Se você tentar mudar de branch agora, o git lançará um erro sugerindo que as alterações devem ser commitada, antes de trocar a branch.
$ git checkout branch_v01 error: Your local changes to the following files would be overwritten by checkout: test/br/com/ederleite/codekata/domino/service/testTable.txt Please, commit your changes or stash them before you can switch branches. Aborting
Para limpar sua área de trabalho e não perder suas alterações, use então o comando stash:
$ git stash Saved working directory and index state WIP on master: eb11b15 Faltou a exception HEAD is now at eb11b15 Faltou a exception
Prontinho, agora sua área de trabalho está limpa e enfim é possível trabalhar em um outra branch, ou recomeçar na branch que você está.
$ git status On branch master nothing to commit, working directory clean
Como disse, suas alterações estão armazenadas na pilha de stashes. Para vê-las, use o comando git stash list:
$ git stash list stash@{0}: WIP on master: eb11b15 Faltou a exception
Este comando exibirá todas as stashes criadas por vocês. Neste exemplo existe apenas uma. A ordem de exibição das stashes é dada sempre da mais recente, essa normalmente recebe o nome (stash@{0}), para a última (stash@{n}).
Para retirar uma modificação da stash, “tirar de baixo do tapete”, e restaurar o diretório de trabalho, use o comando git stash apply. Este por sua vez, pega o stash mais recente (stash@{0}) e restaura-o.
Também é possível restaurar um stash mais antigo, para isso use o comando git stash apply <nome stash> ou git stash apply stash@{2} por exemplo.
$ git stash apply On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test/br/com/ederleite/codekata/domino/service/testTable.txt no changes added to commit (use "git add" and/or "git commit -a")
É isso aí pessoal, espero que tenham gostado!
Para maiores informações sobre git stash, acesse o GIT Book. Ou para ver os posts anteriores sobre Git, acesse um dos links abaixo:
- Git #1 – Por onde começar?
- Git #2: Principais comandos do dia a dia
- Git #3: Tags, Branches e comando remotos
- Git: Trocando de repositório remoto