Fiz m*rda no GIT, e agora?
Quando usar git reset e git revert
Fez commit que não devia? Bagunçou demais na hora do merge? Dois comandos do git são essenciais para corrigir esses problemas:
git reset e git revert.
Mas quando usar um ou outro?
Reset
git reset HEAD~n reverte n commits. Ou seja: git reset HEAD~3 retira os 3 últimos commits da branch local.
Serve para quando você quer descartar o que fez até o momento na sua branch e começar de novo. Os arquivos revertidos ficarão unstaged, então se quiser comitar, precisa fazer git add novamente. Se preferir que os arquivos voltem ao estado inicial, adicionar — hard.
Porém se você já fez push na sua branch, a única forma de enviar as alterações do reset para o servidor é fazendo um git push -f o que resultará em históricos perdidos e bagunçará a git tree.
Por isso, é recomendado NÃO usar esse comando em branches compartilhadas, onde mais de uma pessoa trabalha nela.
Revert
git revert HEAD~n reverte o n-ésimo commit indicado. Ou seja: git revert HEAD~2 vai reverter as alterações feitas somente pelo commit 2 a contar do último commit.
Também pode ser usado indicando o sha do commit, por exemplo:
git revert 12ab34cd
reverterá exatamente o commit 12ab34cd. Esse comando é o mais indicado para ser usado em branches compartilhadas, pois cria um novo commit para as alterações revertidas, mantendo assim históricos.
Resumindo
reset — desaparece com os commits. NÃO usar em branches compartilhadas. revert — desfaz criando novo commit. Pode usar em branches compartilhadas.
Uma prática legal para desfazer commits com tranquilidade é criar branch auxiliar e aí desfazer, pra só então enviar merge para a branch principal. Isso dá mais segurança e fica mais fácil de visualizar as diferenças antes de fazer o merge final.
Referências adicionais
Ambos os commit possuem mais opções que podem ser passadas junto com o comando. A documentação explica todas possibilidades:
O blog da Atlassian explica detalhadamente com desenhos:
A @jesstemporal tem um projeto legal com “colinhas” para os comandos do git (em português):
O site “Learn Git Branching” permite fazer testes com comandos git para simular o que acontece com cada um deles: