Removendo um Commit com Rebase Interativo
Para manipulações de histórico mais complexas, como remover um commit do meio de um branch, você pode usar o rebase interativo (git rebase -i). Este é um comando muito poderoso que reescreve o histórico de commits, portanto, deve ser usado com cautela, especialmente em branches que são compartilhados com outros desenvolvedores.
Nosso objetivo é remover o commit com a mensagem "fix: Add a temporary file that should be removed". Olhando o log atual, este commit é agora HEAD~3.
Inicie o processo de rebase interativo:
git rebase -i HEAD~4
Este comando abrirá seu editor de texto (vim por padrão) com uma lista dos últimos 4 commits.
pick fd5a181 fix: Add a temporary file that should be removed
pick 5f27a4d docs: Update documentation in file1
pick 284be6f chore: Add last-commit file again
pick 8a460c5 Revert "feat: Add file2.txt"
## Rebase 9403080..8a460c5 onto 9403080 (4 commands)
#
## Commands:
## p, pick <commit> = use commit
## d, drop <commit> = remove commit
## ...
Para remover o commit, altere a palavra pick para drop (ou d) na linha que contém "fix: Add a temporary file that should be removed".
Altere isto:
pick fd5a181 fix: Add a temporary file that should be removed
Para isto:
drop fd5a181 fix: Add a temporary file that should be removed
No vim, pressione i para entrar no modo de inserção, faça suas alterações, depois pressione Esc para sair do modo de inserção. Salve e saia digitando :wq e pressionando Enter. O Git irá reproduzir os commits restantes no topo do novo histórico.
Verifique o log para ver o resultado:
git log --oneline --graph
O commit "ruim" agora desapareceu do histórico.
* a5b4c3d (HEAD -> master) chore: Add last-commit file again
* f9e8d7c docs: Update documentation in file1
* 1e2d3f4 Revert "feat: Add file2.txt"
* 5e1a3b2 feat: Add file2.txt
* 1b4c0a9 feat: Add file1.txt
Além disso, verifique os arquivos no diretório. O arquivo bad-commit-file.txt foi removido.
ls