2010-03-12 15 views
30

Acabo de tratar de volver a establecer una base de una rama muy antigua con una pequeña modificación en mi maestro. Hubo un problema al fusionar solo uno de los tres archivos involucrados, así que lo hice sin pensar, pensando que saltaría ese archivo, pero dio la casualidad de que omitió todos mis cambios y rodó hacia adelante . Así que ahora la rebase ha terminado, y mis cambios parecen haber desaparecido.Recuperar de omisión inadvertida durante la rebase

He visto la pregunta sobre undoing rebase, pero todo es griego para mí, veo el reflog, pero no sé a qué compromiso se ha asociado la rama antes de la rebase.

En cualquier caso, realmente no necesito deshacer la rebase, solo quiero poder recuperar los cambios en los dos archivos. ¿Hay alguna forma de hacer esto correctamente? Si esto falla, tendré que restaurar la copia de seguridad de ayer de mi repositorio y seleccionar los bits a mano.

Respuesta

35

Primero, haga un tarball de su carpeta de trabajo de git. Esto hace que sea más fácil probarlo varias veces.

supongamos ocurrió lo siguiente

  • git checkout otra de edad, rama
  • git rebase master
  • algunos problemas (que se omite)

en este punto se encuentra ahora sigue en otra rama antigua y su reflog le muestra:

6f8348f [email protected]{0}: rebase: <commit message of last commit in another-old-branch> 
e547ec0 [email protected]{1}: checkout: moving from another-old-branch to e547ec0d2a558d189464fc57192066b34ec5f28f^0 
65cedf8 [email protected]{2}: checkout: moving from master to another-old-branch 

Imagine que las ramificaciones son como enlaces simbólicos (o punteros), todo lo que tenemos que hacer es dejar que la rama 'otra-vieja-rama' vuelva a señalar en la vieja identificación de compromiso. el compromiso anterior todavía está allí, y no fue tocado por tu rebase. un poco: 'Hey git, otro de edad-rama es e547ec0d2, olvidar todo lo que pasó'

En nuestro caso aquí que era e547ec0d2a558d189464fc57192066b34ec5f28f, así que lo que tenemos que hacer ahora es

  • git checkout otro- la vieja rama # si no está ya allí
  • git reset e547ec0d2a558d189464fc57192066b34ec5f28f --hard

ahora su rama está de vuelta a la normalidad. Y puedes volver a intentar tu rebase.

Tenga en cuenta que su reflog es ahora un poco más complicado que el ejemplo anterior. pero debería seguir allí en alguna parte ...

¡buena suerte!

+1

No, debo haber arruinado algo más mientras trataba de recuperarme. Respuesta marcada para la próxima vez ... – Benjol

+8

+1; Otro consejo: 'git log -g' puede ser una forma más agradable de navegar el reflog. –

+2

¡Funcionó como un encanto! Acabo de guardar mi mañana gracias – kmanzana