Git cómo revertir una rebase

104

En Git, ¿cómo deshace una rebase si no está satisfecho con ella?

Git no tiene ejecución en seco para rebase. Si hice un cambio de base y aún no lo presioné, ¿cómo retrocedo a antes, como si nunca hubiera sucedido?

user1615666
fuente
4
git rebase --abort
olibiaz
2
¿Qué quieres decir con "fallido"? ¿ Completaste el rebase y no te gustan los resultados? ¿O tuvo conflictos y quería detener el rebase en el medio? Supongo que lo primero, ya que no se puede impulsar una rebase inacabada en conflicto, pero pregunto porque son dos preguntas diferentes.
Edward Thomson
sí, ex. Gracias.
user1615666
3
Posible duplicado de Deshacer una rebase de git
Jon Schneider

Respuestas:

214

Puede usar el reflog para encontrar la primera acción antes de que comenzara la rebase y luego restablecerla. p.ej

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Ahora debería volver a antes de que comenzara la rebase.

Para encontrar el lugar correcto para restablecer, simplemente elija la entrada más cercana a la parte superior que no comience con "rebase".

Enfoque alternativo

Si la rebase es lo único que ha hecho en la rama, es decir, no tiene confirmaciones / cambios sin presionar, entonces puede eliminar la rama local con git branch -Dy luego verificarla nuevamente:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

O para el mismo efecto, puede restablecer --hard a la rama de origen:

$ git reset --hard origin/my-branch

Si hizo esto mientras tenía otras confirmaciones sin presionar, las habrá perdido. En ese caso, simplemente use el enfoque de reflog anterior para volver a la entrada de reflog donde realizó las confirmaciones.

Robbie
fuente
11
Otro atajo útil: rebase establece ORIG_HEADel valor hash original de la rama que se está rebasando. Entonces, en lugar de encontrar el número 2 para HEAD@{2}, puede usar ORIG_HEAD... pero solo si ORIG_HEADaún no lo molestan. Un montón de comandos de Git lo configuran (rebase, am, reset y merge, en diversas circunstancias).
torek el
1
¡Gracias Señor! Gran ayuda en esto :)
Alec
1
gracias mi código fuente de nuevo .... después de usar este $ git reset HEAD @ {2} --hard
reza rahmad
¡Recibe mi voto a favor por sugerir simplemente eliminar la rama local y tirarla de nuevo!
quicklikerabbit
1
Este es un salvavidas. Gracias @Robbie
Nelson Katale
42

Rebase mantiene una copia de seguridad del estado anterior como ORIG_HEAD.
Para que pueda revertir la última rebase ejecutando:

git reset --hard ORIG_HEAD
Meligy
fuente
1
¿Sabe dónde está documentada esa etiqueta?
Ben S
¿Hay alguna desventaja en esto o es una característica nueva? Esto parece mucho más fácil que revisar un reflog.
1252748
No es nuevo Pero normalmente lo usarías justo después de la reorganización, no puedes retroceder después de varias rebases, etc. Para estas situaciones complejas, buscarías las cosas de relog, pero solo por "Ups, ¿qué acabo de hacer? ¿Cómo puedo revertir? ¿que ahora?" funciona bien.
Meligy