Como tudo que fazemos em git pode ser feito de inúmeras formas diferentes, existem alguns jeitos de se livrar de commits, a forma mais comum de desfazer um ou mais commits recentes é usando o comando git reset que vou te mostrar nessa colinha.

O que é o HEAD?

O HEAD é um ponteiro que indica qual branch e commit você está. Ele é usado com frequência e muitas vezes sem você mesmo saber que ele é acessado para trocar de branches por exemplo.

O que é o git reset?

O git reset por sua vez é um comando que restaura um estado anterior do HEAD, por isso que usamos o HEAD ao desfazer commits, para indicar qual o estado anterior que você quer voltar.

Por exemplo suponha que você tem um estado como o a seguir:

figura mostrando o ramo main com dois commits A e B

Se você quer desfazer o último commit B você quer voltar ao estado do commit A.

Desfazendo o último commit

Para desfazer o último commit feito você deve usar o comando a seguir:

git reset HEAD~1

Ou o comando a seguir, que é um atalho para o comando acima:

git reset HEAD^

Ou até mesmo o atalho a seguir:

git reset HEAD~

Esses três comandos querem dizer o seguinte:

Volte ao estado anterior ao último commit.

Note que ao executar esses comandos, você não verá mensagem informando que o commit foi desfeito, mas se você rodar o comando git status após fazer algum desses três comandos verá que arquivos adicionados e/ou alterações feitas voltam a serem marcados como alterações a serem commitadas (adicionadas à um commit).

Veja, suponha que você tenha um histórico como o da imagem a seguir, onde o último commit (48ccb8) adiciona o arquivo chamado arquivo-4.txt: captura de tela mostrando o histórico de commits contendo 5 commits no terminal

E se você executar algum dos comandos acima seguido de um git status você verá um resultado assim:

captura de tela mostrando o resultado de desfazer um commit e fazer o git status em seguida

E pode ver que o arquivo-4.txt voltou ao seu estado anterior que era esperando ser feito o commit. E se investigar o histórico novamente verá que o commit 48ccb8 não aparece mais.

captura de tela mostrando o detalhe do histórico de commits sem a presença do commit desfeito

Agora você pode descartar as alterações ou continuar com elas e fazer um novo commit.

Desfazendo os três últimos commits

Agora que você sabe desfazer um commit, você pode usar o primeiro comando que acabou de ver e adpatá-lo para desfazer mais commits, para isso basta adicionar a quantidade de commits que você quer desfazer depois do ~. Vamos olhar novamente o nosso histórico que agora contém apenas quatro os commits (pois já desfiz um):

captura de tela mostrando o histórico de commits contendo 4 commits no terminal

Agora vamos supor que eu quero voltar ao estado do commit d815be que é o commit inicial que adicionou o arquivo README.md. Para isso é necessário desfazer três commits, então para isso o comando indicado é este:

git reset HEAD~3

Ao executá-lo e rodar mais uma vez o git status temos os três arquivos que foram adicionados pelos commits desfeitos:

captura de tela mostrado o resultado de desfazer 3 commits e executar o git status novamente

Note que antes de executar esses comandos eu removi o arquivo-4.txt já que não vou precisar mais dele. E investigando novamente o histórico vemos apenas o commit inicial:

captura de tela mostrando o histórico de commits mostrando apenas o commit inicial já que os outros foram desfeitos

Antes de terminar a colinha eu quero deixar uma recomendação: é uma boa prática evitar desfazer commits que você já tenha feito push para evitar de causar problemas de detached HEAD para outras pessoas trabalhando junto com você.

GitFichas

Abaixo você encontra GitFichas pra te ajudar a lembrar desses comandos e atalhos:

Espero que essa colinha te ajude a desfazer commits. 😉