2010-04-22 20 views
51

¡Mierda! Hace aproximadamente una semana, estaba reescribiendo algunos commits mientras trataba de limpiar mi repositorio, y aparentemente no terminé realmente. Hoy, una semana y varios commits más tarde, fui a rebase para reordenar algunos commits a partir de hoy, y me dijeron que ya estaba en medio de una rebase.Aborted git rebase anterior y commits perdidos desde que comenzó la rebase

Eso debería haber sido una señal para copiar mi repositorio por si acaso. Pero no lo hice ... en su lugar corrí git rebase --abort que sonaba justo en ese momento. Bueno, eso no estaba bien. Anuló la rebase de hace una semana y restableció la HEAD del maestro a la anterior. ¡Tonto!

Tengo varias otras ramas que son bastante recientes, y he presionado a control remoto varias veces, pero los cambios más recientes parecen haber desaparecido para siempre. No poseo el nivel apropiado de git-fu para saber si hay alguna forma de recuperar mis cambios.

¿Estoy jodido?

EDIT - ¡GUAU! ¡Gracias chicos! git reflog es increíble! Estoy completamente recuperado ... lección aprendida. Marcado La respuesta de Tchalvak fue aceptada por ser la primera en publicar.

Respuesta

78

Compruebe git reflog. Puede retroceder en el tiempo utilizando esos valores hash de confirmación como referencia en casi todos los casos.

Copie físicamente el directorio de git repo en otro lugar como un lugar para hacer pruebas preliminares para ver qué funciona, de esa manera usted puede meterse con lo que quiera sin perder archivos sin seguimiento o poner las cosas en un estado que no puede volver.

+10

'git reflog' acaba de salvarme de perder horas de trabajo. ¡Gracias! –

+4

Te amo por esta respuesta. Si pudiera votar diez veces, lo haría. – RobW

+0

salvó la mía también. ¡muchas gracias! – liuyu

58

Debería poder obtener el SHA1 de sus confirmaciones más recientes (que desapareció después de la rebase --abort) con un git reflog.

Podrá entonces para restablecer la rama actual a los SHA1

# Suppose the old commit was [email protected]{2} in the ref log 
git reset --hard [email protected]{2} 

Es un poco como "Undoing a git reset --hard HEAD~1".

Consulte también "illustrated guide to recovering lost commits with Git", para otros ejemplos de recuperación.