2010-02-27 633 views
12

Perdí mi último commit porque accidentalmente ejecuté "git reset --hard HEAD ^". Nota: No quería poner el "^" al final.Lost Last Git Commit

¿Hay alguna forma de recuperarlo? Fue 2 días de trabajo :(

+2

En cualquier caso, NO use git gc. Eso eliminará los commits no enlazados permanentemente. – Tronic

+0

No, gc * no * perderá esa confirmación a menos que haya hecho un esfuerzo para que sea más fácil para que git olvide sus confirmaciones (desactivación o poda agresiva). Cualquiera que haya pasado el tiempo suficiente para aprender a configurar git para perder su compromiso más reciente al menos sabrá que no debe hacer la pregunta. – Dustin

+5

'git gc' de forma predeterminada no elimina commits no enlazados si están en reflog hasta 30 días en el caso de confirmaciones sin referencia (por defecto). –

Respuesta

25

Creo que this article es lo que busca Según el artículo, su cometen es "ido", pero no el recolector de basura - algo así como la papelera de reciclaje en Windows

ejecuta git fsck --lost-found. para encontrar el 'compromiso colgante', y míralo con git reflog, luego combina el compromiso pendiente con tu rama actual, git merge 7c61179.

+0

Gracias. Eso lo hizo. Sabía que solo estaba flotando por allí en algún lugar, desvinculado de la rama. –

+0

En combinación con difftool, he resuelto el problema de "pérdida de compromiso": git fsck --lost-found (se muestran hashes de commit colgantes) git difftool SOME_HASH somefolder/(He intentado todos los commit pendientes, hasta que he encontrado el necesario) –

6

Si conoce el ID comprometerse (por ejemplo, desplazarse hacia atrás en su terminal o utilizar git reflog),

git reset --hard 61567de5d9 

Dónde 61567de5d9 son las primeras cifras de la última (perdido) cometen ..

21

git hace que sea muy fácil volver a un estado anterior y trabaja muy duro para evitar que pierda los datos que ha cometido. Es por esta razón que deberías comprometerte a menudo. Tengo un comando git trash que hace ese estado git reset --hard, pero después de escribir una confirmación para poder deshacer el restablecimiento completo si lo necesito.

Para el estado más reciente (es decir, su caso), simplemente haga git reset --hard ORIG_HEAD para deshacer lo que acaba de hacer.

Usted puede hacer un tiempo basado restablecer: git reset --hard '@{5 minutes ago}' ponerse en un estado anterior en función del tiempo (hay un montón de opciones que puede utilizar, por ejemplo, git reset --hard '@{yesterday}' para pretender hoy nunca ocurrió).

De lo contrario, busque la salida git reflog para encontrar la cosa antes de la acción que siente que puso en mal estado y se restablece a eso.

+1

Más general puedes usar '@ {1}', o 'HEAD @ {1}' en lugar de 'ORIG_HEAD'. –