Git Avançado 01

Fonte: Wikiversidade

Git Stash[editar | editar código-fonte]

O 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[editar | editar código-fonte]

Para 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[editar | editar código-fonte]

Para 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[editar | editar código-fonte]

Utiliza-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[editar | editar código-fonte]

Atalho                  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[editar | editar código-fonte]

Conflitos 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...)