Git Stash e Apagar commit com force push

Git stash editar

Introdução editar

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

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




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

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

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

Introdução editar

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

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.