Deshacer Rebase en Git
Este tutorial hablará sobre cómo deshacer un rebase
realizado en una rama en Git.
Rebasar es la operación de mover la base de una rama a una base más nueva. Supongamos que tenemos una rama de funciones basada en la rama principal. Luego, la rama principal tiene algunas commits nuevas; es posible que deseemos reajustar la rama de funciones en función de esas nuevas.
Podemos repensar esta operación de rebase
. Ya no queremos basar la nueva rama de funciones en las nuevos commits en la rama principal.
Queremos que la rama de características se base en los commits cuando la ramificamos por primera vez desde la rama principal. Por lo tanto, para lograr esto, ahora necesitamos deshacer la operación rebase
realizada en la rama.
Ahora ilustraremos esto con un ejemplo.
Uso de git reflog
y git reset
para deshacer un rebase
realizado en una rama en Git
Digamos que tenemos una rama main
y hemos creado una nueva rama feature1
encima de ella.
Y digamos que se han producido algunas commits en la rama main
. Hemos hecho una rebase
de la nueva rama feature1
basada en esas nuevos commits. Esta es la operación que queremos deshacer.
Para deshacer el rebase
, podemos usar el comando reflog
de Git. Usando git reflog
, podemos determinar el compromiso principal de la rama inmediatamente antes de que comience la rebase
.
Ahora ejecutaremos el comando git reflog
en la rama feature1
(una en la que se hizo rebase
)
$ 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}
fue el compromiso justo antes de la operación rebase
.
Podemos usar git reset
para restablecer la rama a este compromiso de la siguiente manera.
$ git reset HEAD@{2} --hard
Después de ejecutar el comando anterior, la rama feaure1
se encuentra ahora en un estado justo antes de la rebase
.
Alternativamente, también se puede deshacer un rebase
usando git reset
de la siguiente manera.
$ git reset --hard ORIG_HEAD
El ORIG_HEAD
se crea mediante comandos que mueven drásticamente su HEAD
para registrar la posición del HEAD
antes de su operación para que pueda cambiar fácilmente la punta de la rama al estado anterior a ejecutarlos.
La advertencia de este enfoque alternativo es que no se deberían haber realizado otras operaciones después de la rebase
no deseada que pueda cambiar el ORIG_HEAD
a saber. reset
, rebase
o merge
.
Por lo tanto, podemos deshacer una rebase
no deseada en una rama en Git a través de estos métodos.