¿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.
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.
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:
¿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.
Respuestas:
Puede usar el reflog para encontrar la primera acción antes de que comenzara la rebase y luego restablecerla. p.ej
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 -D
y luego verificarla nuevamente:O para el mismo efecto, puede restablecer --hard a la rama de origen:
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.
fuente
ORIG_HEAD
el valor hash original de la rama que se está rebasando. Entonces, en lugar de encontrar el número 2 paraHEAD@{2}
, puede usarORIG_HEAD
... pero solo siORIG_HEAD
aún no lo molestan. Un montón de comandos de Git lo configuran (rebase, am, reset y merge, en diversas circunstancias).Rebase mantiene una copia de seguridad del estado anterior como
ORIG_HEAD
.Para que pueda revertir la última rebase ejecutando:
fuente