Saltar para o conteúdo

Git Stash e Apagar commit com force push

Fonte: Wikiversidade

Durante a produção de um software é comum que ocorram situações inesperadas, gerando a necessidade de que o desenvolvedor tenha que dar uma pausa no que está desenvolvendo para, por exemplo, integrar alguma atualização feita no repositório ou simplesmente mudar de branch para executar outro trabalho mais urgente. O problema surge quando o desenvolvedor não quer ou não pode dar o commit de algo incompleto (ou com erros) para poder retomar isso mais tarde. Para isso, uma solução cabível é o uso do git stash.

Como funciona?

[editar | editar código-fonte]

O Stash é basicamente tirar o estado sujo do seu diretório de trabalho - ou seja, remover as alterações que tenham sido feitas - e salvá-las em uma pilha de modificações inacabadas.

Aqui, existe um código incompleto que não queremos dar commit.

Foto1
Foto1




Ao executar o comando $ git stash  o diretório de trabalho é “limpado” e o git nos informa que voltamos ao estado do último commit.




Executando o comando $ git status é possível confirmar isso.




Para ver o que temos salvo na pilha, podemos utilizar o comando $ git stash list O qual nos mostra uma pilha de modificações inacabadas (stashes) salvos até então. No stash@{0} podemos ver o stash que fizemos no passo anterior.




Agora, quando quisermos, poderemos aplicar ao nosso código as modificações contidas no stash utilizando o comando

$ git stash apply stash@{N}

no qual N representa o número do stash que queremos aplicar. No nosso caso, N é igual a 0.




Então, o git nos mostra os arquivos modificados do stash que acabamos de aplicar, indicando o sucesso da operação.

Criando Branch para Stash

[editar | editar código-fonte]

E quando desejamos dar uma “pausa” no atual trabalho da branch e realizar um outro trabalho na mesma branch? Para facilitar esse processo podemos usar o git stash e logo em seguida usar o comando: $ git stash branch nomeDaBranch que cria uma nova branch para um stash e apaga o mesmo do stash list caso ele tenha sido aplicado com sucesso. Ao final teremos uma nova branch com o stash aplicado, ou seja, nada no stash list  e na branch “antiga” não teremos o stash aplicado, assim as alterações dos commits anteriores não são mescladas.



Acabou por aqui?

[editar | editar código-fonte]

Não, existem várias outros comandos do git stash que podem ser úteis no dia a dia de um usuário de Git. Como é possível ver utilizando o comando $ git stash -- help.

Apagar commit com force push

[editar | editar código-fonte]

Por descuido pode acontecer de ser enviado ao repositório na nuvem algum commit que não deveria ser enviado por diversos motivos, como, por exemplo, a existência de algum erro grave no código. Para contornar essa situação é possível retornar ao estado anterior do repositório utilizando um force push, porém, todo cuidado é pouco ao utilizar essa abordagem, pois pode até mesmo quebrar seu repositório na nuvem.

Como funciona?

[editar | editar código-fonte]

Partiremos de um ponto em que o commit com erro já foi enviado, como mostra a imagem a seguir.




Então, utilizaremos abordagens para consertar o erro na nossa máquina, localmente. Pode-se, por exemplo, remover o erro, se possível e acrescentar ao último commit utilizando a tag ammend. Porém, nesse exemplo, removeremos por completo o commit com erro e retornaremos ao estado anterior do repositório. Utilizando $ git log é possível ver os commit e suas respectivas hashes.




Para voltar ao estado do commit anterior e descartar todas as mudanças, é utilizado um $ git reset --hard [hash do commit alvo], como no exemplo.




O git nos informa o sucesso da operação, que pode ser confirmado através do $ git status e também $ git log.

Se nesse momento tentarmos dar um $ git push será retornado um erro, informando que nosso repositório está desatualizado em relação ao repositório na nuvem.




Então, por isso é necessário que esse push seja forçado, usando a tag -f. É nesse momento que se deve ter cuidado, pois o repositório da nuvem será sobrescrito com as informações do seu repositório local.




Como é possível ver, o commit foi apagado com sucesso do repositório.