O que fazer após aplicar um rebase errado
Olá, caro leitor,
Decidi compartilhar esta experiência porque ela pode ser útil, principalmente em tempos em que LLMs geram muito código e realizam refatorações de sistemas rapidamente. Misturado com necessidades de alta criticidade, é fácil cometer alguns erros, como o da breve história a seguir.
Depois de dois dias trabalhando em uma refatoração de código que não possuía camadas bem definidas, envolvendo uma biblioteca wrapper para acesso ao banco de dados e o código principal que expunha alguns endpoints, eu movi toda a lógica de parsing do banco para o wrapper e deixei as regras de negócio e validações no código principal.
Somado a isso, havia um uso excessivo de funções da biblioteca Ramda para gerar os payloads de resposta, sem utilizar o padrão Data Transfer Object (DTO). Isso tornava muito difícil garantir que o código estivesse correto sem quebrar algum tipo de resposta.
Com o contexto explicado, vamos à situação principal.
Quando terminei as validações e os testes unitários, precisei sincronizar meu código com a branch principal. Então executei o seguinte comando, resolvi os conflitos em modo rebase e foi aí que tudo começou a dar errado:
git pull origin main
Durante a resolução dos conflitos, não percebi todas as alterações que estavam sendo aplicadas. Apenas corrigi os conflitos, aceitei o rebase e abri o Pull Request.
Isso aconteceu no final do dia, então não me julgue (risos).
Vamos admitir: foi um erro de iniciante!
Como resolvi
Perguntando para uma IA generativa como eu poderia reverter esse problema de rebase, descobri algo muito interessante: o comando abaixo.
git reflog --date=iso
Reflog significa Reference Log. Ele funciona como um log de auditoria do ponteiro HEAD: toda alteração nesse ponteiro é registrada.
Algumas características importantes:
- O histórico do reflog expira após aproximadamente 30 a 90 dias.
- Ele existe apenas na sua máquina local.
- As informações do reflog não são enviadas para o repositório remoto.
O resultado do comando se parece com a imagem abaixo:
Com esses registros em mãos, basta criar uma nova branch apontando para o commit desejado.
No meu caso, criei uma nova branch utilizando o seguinte comando:
git switch -c fix/rollback-before-rebase f23839f
E isso salvou o meu dia!
Conclusão
O git reflog é uma ferramenta extremamente útil para recuperar estados anteriores do repositório quando algo dá errado, especialmente após rebases, resets ou outras operações que alteram o histórico.
Se você já passou por uma situação parecida, vale a pena conhecer e dominar esse comando.
Obrigado pela leitura! E me conte o que achou.