Desfazer Rebase em Git

Azhar Bashir Khan 25 dezembro 2021
Desfazer Rebase em Git

Este tutorial irá falar sobre como desfazer um rebase feito em um branch no Git.

Rebasing é a operação de mover a base de um galho para uma base mais nova. Suponha que temos um branch de recurso baseado no branch principal. Então, o branch principal tem alguns novos commits; podemos querer realocar o branch de recursos com base nesses novos.

Podemos repensar esta operação de rebase. Não queremos mais basear o novo branch de recursos nos novos commits no branch principal.

Queremos que o branch de recursos seja baseado nos commits quando o ramificamos pela primeira vez a partir do branch principal. Assim, para conseguir isso, agora precisamos desfazer a operação rebase feita no branch.

Vamos agora ilustrar isso com um exemplo.

Usando git reflog e git reset para desfazer um rebase feito em um branch no Git

Digamos que temos um branch main e criamos um novo branch feature1 em cima dele.

E vamos dizer que alguns commits aconteceram no branch main. Fizemos um rebase do novo branch feature1 baseado nesses novos commits. Esta é a operação que queremos desfazer.

Para desfazer o rebase, podemos usar o comando reflog do Git. Usando git reflog, podemos determinar o head commit do branch imediatamente antes do rebase começar.

Vamos agora executar o comando git reflog no branch feature1 (aquele em que rebase foi feito)

$ git reflog

b745978 HEAD@{0}: rebase: that commit
4sd7c1c HEAD@{1}: rebase: this commit
adf3d3d HEAD@{2}: checkout: moving from main to feature1
...

Podemos ver que HEAD@{2} foi o commit antes da operação de rebase.

Podemos usar git reset para redefinir o branch para este commit da seguinte maneira.

$ git reset HEAD@{2} --hard

Depois de executar o comando acima, o branch feaure1 está agora em um estado imediatamente antes do rebase.

Alternativamente, também se pode desfazer um rebase usando git reset como segue.

$ git reset --hard ORIG_HEAD

O ORIG_HEAD é criado por comandos que movem drasticamente o seu HEAD para gravar a posição do HEAD antes da sua operação, para que possa facilmente alterar a ponta do ramo de volta ao estado anterior à sua execução.

A advertência a esta abordagem alternativa é que nenhuma outra operação deveria ter sido feita após o não desejado rebase que pode alterar a viz. reset, rebase ou merge.

Assim, podemos desfazer um rebase indesejado em um branch no Git por meio desses métodos.

Artigo relacionado - Git Rebase