2012-02-28 17 views
54

Hice algo muy estúpido. Realicé una confirmación mediante git commit (ediciones de archivos + archivos nuevos) (C). Luego hice la modificación del último compromiso. Luego eliminé todos los archivos recursivamente (!) Usando git rm -r Luego hice otro commit de git (C).Deshacer eliminar en GIT

 
A-B-C 
    ↑ 
    master 

¿Hay alguna manera de recuperar los archivos pero mantener los cambios que tuve en mi primer compromiso? (C) Prefiero no volver a (B). Intenté restaurar git --soft head ^, entonces el estado de git enumera los archivos que eliminé, luego hice el pago de git, pero todavía no tuve suerte. Ni siquiera sé si es posible.

+0

¿quieres recuperar tus archivos de commit A? – uday

+1

No, todavía quiero estar en C, pero sin archivos eliminados, solo las modificaciones y archivos de mi archivo. No tengo los archivos en mi árbol de trabajo ahora, se eliminan. – Nately

Respuesta

158

Hazte un favor y no hagas git checkout <hash> como la otra respuesta sugiere y entra en más problemas.

si ha eliminado archivo desde el directorio de trabajo y no se haya cometido los cambios, sin embargo, hacer:

git checkout -f 

PRECAUCIÓN: Confirmar archivos no comprometidos antes de ejecutar este comando, de lo contrario vas a perderlos a todos

Los archivos eliminados deberían estar de nuevo.

Si no es así y si puede encontrar la confirmación que desea (C, etc., su pregunta no está clara) desde git reflog, simplemente haga git reset --hard <hash from reflog> y debe estar todo listo.

+3

+1 Puede agregar un enlace a una pregunta principal separada (como http://stackoverflow.com/questions/3965676/why-did-git-detach- my-head/3965714#3965714), para ilustrar el problema con el git checkout SHA1 respuesta. ¿ORIG_HEAd habría ayudado en este caso? (http://stackoverflow.com/questions/964876/head-and-orig-head-in-git/964927#964927) – VonC

+1

Ok, esta es la mejor respuesta. reset --hard to me deja en mi rama principal, y no me dejan en el estado 'HEAD separado'. La respuesta de Sasha también fue buena en caso de recuperar mis datos perdidos. – Nately

+2

Gracias por salvarme el culo ahora. – Seth

5

Si te entendí correctamente reescribiste la confirmación C. Entonces la confirmación original, llamémosla C1 no es accesible desde tu gráfica de confirmación, pero aún está allí (git guarda todas las confirmaciones por un tiempo). Use git reflog para obtener el hash de confirmación y git checkout <hash> u otro comando apropiado para obtener el estado antiguo C1.

+0

¡Dios mío! ¡Muchísimas gracias! El compromiso estaba allí. Me salvaste tres semanas de trabajo (desde el último commit;)). ¡GRACIAS! – Nately

+0

Una pregunta más. Ahora dice que estoy en estado 'HEAD separado'. ¿Cómo vuelvo para estar en mi rama 'maestra'? – Nately

+0

De nada. Sin embargo, no entiendo el voto a la baja. Un reinicio de git --hard es potencialmente mucho más peligroso. No estaba claro si el póster había modificado la confirmación C original con los cambios que quería mantener. – Sascha