Git Avançado 01
Git Stash
editarO stashing serve quando necessita-se abandonar o trabalho em andamento, afim de trabalhar em outro diferente, normalmente em outra _Branch_, porém é necessário manter o estado destas modificações a salvo, mas o código não esta adequado para commitar. Ao invés de comitar este trabalho, o ideal é guardar estes arquivos não comitados salvo, para alternar para a branch com o problema de maior prioridade, e posteriomente voltar para a branch quando necessário, regatando os arquivos no Stash.
Para salvar um stash, basta execultar o comando git stash ou git stash save.
$ git stash
Saved working directory and index state \
"WIP on master: 686b55d added the index file"
HEAD is now at 686b55d added the index file
(To restore them type "git stash apply")
Uma vez aplicado o git stash, o diretório local de trabalho desfaz o commit atual, limpando o espaço de trabalho. Assim todos os arquivos presentes não estão mais presentes, podendo agora alteranar de branchs sem problema.
Listando os stash
editarPara visualizar os stashes presentes, usa-se o comando git stash list
$ git stash list
stash@{0}: WIP on master: 686b55d
stash@{1}: WIP on devel: b2bdead Add dogs.
stash@{2}: WIP on devel: b2bdead Add dogs.
No exemplo acima tem-se três stashs, no caso dois stash tinham sido aplicados anteriormente com os identificadores como stash@{1} e stash{2} além do ultimo stash{0}.
Aplicando o stash
editarPara aplicar o stash, utiliza-se o comando git stash apply stash{n}, caso o stash{n} seja omitido aplica-se o stash mais recente.
$ git stash apply
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
#
# modified: example0.html
# modified: lib/testeExampleStash.rb
$ git stash apply stash@{1}
# On branch devel
# Changes not staged for commit:
#
# modified: example0.html
Deletando stashes
editarUtiliza-se o comando git stash drop para discartar o stash
Exibindo os stashs presentes.
$ git stash list
stash@{0}: WIP on gerbils: b2bdead Add dogs.
Deletando o stash.
$ git stash drop
Dropped (6dc716f...)
Visualisando a lista de stash vazia após o stash drop
$ git stash list
Atalhos
editarAtalho equivalente
git stash git stash save
git stash apply git stash apply stash@{0}
git stash drop git stash drop stash@{0}
git stash pop git stash apply
git stash drop
STASH CONFLICTS
editarConflitos são possíveis ao aplicar um stash.
$ git stash apply
error: Your local changes to the following files would be
overwritten by merge:
index.html
Please, commit your changes or stash them before you can merge.
Aborting
Para resolve-los existem alguma técnicas, como resetar o repositório local antes de aplicar o stash :
$ git reset --hard HEAD
$ git stash apply
# On branch gerbils
# Changes not staged for commit:
...
# modified: index.html
Você pode verificar os conflitos e execultar o merge como um conflito normal.
$ git stash apply
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Caso você esteja utilizando o git stash pop de atalho, pode haver um conflito, sendo necessário mesclar as linhas do merge como de costume.
$ git stash pop
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Porém o stash não será deletado automaticamente, necessitando executar o stash drop
$ git stash list
stash@{0}: WIP on gerbils: b2bdead Add dogs.
$ git stash drop
Dropped refs/stash@{0} (e4ba8a4...)