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.