Git: Renomear, desfazer, mesclar ou excluir commits


Se você sempre quis saber ou se já sabe mais nunca lembra os comandos de como renomear, desfazer, excluir ou mesclar um ou mais commits você chegou no lugar certo. ;)

Antes de tudo precisamos saber que com o comando abaixo conseguimos visualizar a hash, mensagem e a ordem que os commits foram feitos:
git log --oneline

- Renomeando um commit
Para mudar a mensagem do último commit, você pode utilizar o --amend:
git commit -m "Nova mensagem que vai substituir a anterior" --amend

Para mudar a mensagem de um commit específico, você pode usar o rebase interativo:
git rebase -i f0b5417~1
Repare no ~1, isso indica que irá buscar o commit da hash indicada e todos os demais commits a partir dela. Se você não colocar o ~1 o commit da hash pesquisa não irá ser mostrado no editor de texto a ser aberto, apenas os commits a partir dela.

Caso você queira buscar os 3 últimos commits:
git rebase -i HEAD~3

Seu editor de texto irá iniciar. Troque no texto a palavra pick por reword (ou só r) do commit desejado, exemplo:
pick fef7501 Terceiro commit
reword 90d77f4 Segundo commit
pick b82a17f Primeiro commit

Salve o arquivo e feche seu editor. Seu editor será iniciado novamente, dessa vez com a mensagem original do commit a ser modificado. Modifique-a, salve e feche o editor.

Nesse momento seu commit já estará com a mensagem nova e você já pode fazer o push de sua branch. Se você já tiver feito o push anteriormente será nescessário fazer um push forçado:
git push -f

Mas cuidado pois esse comando irá excluir o commit que você havia feito anteriormente e irá criar um novo commit enviando-a para o servidor.

- Mesclando dois commits e descartando a mensagem de um
Primeiramente identifique a hash do commit que você quer mesclar e execute o comando abaixo alterando b82a17f para a hash que você identificou:
git rebase -i b82a17f~1

Seu editor de texto irá iniciar. Troque no texto a palavra pick por fixup (ou só f) do commit que você quer mesclar, exemplo:
pick fef7501 Terceiro commit
fixup 90d77f4 Segundo commit
pick b82a17f Primeiro commit

Nesse momento a hash 90d77f4 será mesclada com a hash fef7501 e a mensagem da hash 90d77f4 será mantida e a mensagem da hash fef7501 será descartada. Para ver o log basta digitar git log

- Mesclando vários commits de uma só vez
Iremos mesclar os 3 últimos commits e para isso iremos executar o comando:
git rebase -i HEAD~3

Seu editor de texto irá iniciar. Troque no texto a palavra pick por squash (ou só s) dos commits que você quer mesclar, exemplo:
pick fef7501 Terceiro commit
squash 90d77f4 Segundo commit
squash b82a17f Primeiro commit

Salve o arquivo e feche seu editor. Seu editor será iniciado novamente mostrando algo parecido com isso:
# This is a combination of 3 commits.
# This is the 1st commit message:

Terceiro commit

# This is the commit message

Segundo commit

# This is the commit message

Primeiro commit

Nesse momento você pode comentar as mensagens do primeiro e segundo commit colocando um # antes da mensagem, caso não queira mesclar as mensagens dos três commits em uma única mensagem. Caso queira você pode colocar uma nova mensagem de commit para essa mesclagem:
# This is a combination of 3 commits.
# This is the 1st commit message:

Nova mensagem para o commit

# This is the commit message

# Segundo commit

# This is the commit message

# Primeiro commit

Pronto, após salvar o arquivo os commite serão mesclados e será gerado um novo commit com a mensagem que você informou.

Note que nesse momento pode ser que gere algum conflito e você terá que tratá-los para finalizar a edição.

- Desfazendo commits
Para excluir um ou mais commits mas mantendo as alterações dos arquivos, basta executar o comando abaixo:
git reset HEAD~1

Note que o ~1 indica que iremos desfazer apenas o último commit. Assim que o comando for executado o commit será excluído e as alterações serão revertidas para o estado working directory, aquele momento antes do git add e git commit.

Caso você queira excluir o commit e suas alterações basta adicionar o --hard ao comando:
git reset --hard HEAD~1

Se você quer desfazer um commit mas manter o seu comentário basta executar:
git revert HEAD

- Excluindo commits
Iremos buscar os 3 últimos commits e para isso iremos executar o comando:
git rebase -i HEAD~3

Seu editor de texto irá iniciar. Troque no texto a palavra pick por drop (ou só d) dos commits que você quer excluir, exemplo:
pick fef7501 Terceiro commit
drop 90d77f4 Segundo commit
drop b82a17f Primeiro commit
Salve o arquivo e feche seu editor. Você deverá ver uma mensagem de sucesso e se rodar o comando git log --oneline verá que os commits foram excluídos.

Você poderia fazer isso utilizando o git reset --hard mais a probabilidade de dar problema é bem grande, caso você não tenha domínio sobre o comando.

Dica:
Pode ser que em algum momento, durante o comando de git rebase -i, você tenha que rodar o comando git rebase --continue ou git rebase --abort para cancelar a operação.

Comentários

Postagens mais visitadas deste blog

asdf-vm: Gerenciador de versão extensível com suporte a várias linguagens e ferramentas de desenvolvimento

PostgreSQL + Docker: Criando uma instância do Postgres com Docker