¿Es posible deshacer los cambios causados por el siguiente comando? ¿Si es así, cómo?
git reset --hard HEAD~1
git
version-control
git-reset
Paul Wicks
fuente
fuente
--hard
descarta los cambios no confirmados. Dado que estos no son rastreados por git, no hay forma de restaurarlos a través de git.Respuestas:
Pat Notz está en lo correcto. Puede recuperar la confirmación siempre que haya sido dentro de unos días. git solo se recolecta basura después de aproximadamente un mes más o menos a menos que explícitamente le diga que elimine las gotas más nuevas.
Puede ver en el ejemplo que el archivo2 se eliminó como resultado del restablecimiento completo, pero se volvió a colocar cuando restablecí a través del registro.
fuente
git log -g
puede ser una forma un poco más agradable de ver el reflog quegit reflog
.git reflog
másgit log -g
simplemente porque se obtiene toda la información en una línea con sha1, información HEAD y los mensajes de confirmación todos alineados. Mucho más fácil de leer.Lo que desea hacer es especificar el sha1 de la confirmación a la que desea restaurar. Puede obtener el sha1 examinando el reflog (
git reflog
) y luego haciendogit reset --hard <sha1 of desired commit>
Pero no espere demasiado ... después de unas pocas semanas, git eventualmente verá ese commit como sin referencia y eliminará todos los blobs.
fuente
La respuesta está oculta en la respuesta detallada anterior, simplemente puede hacer:
(Ver la salida de git reflog show )
fuente
Es posible recuperarlo si Git aún no ha recolectado basura.
Obtenga una descripción general de los compromisos pendientes con
fsck
:Recupere el commit colgante con rebase:
fuente
Si tienes suerte, como yo, puedes volver a tu editor de texto y presionar 'deshacer'.
Sé que esa no es realmente una respuesta adecuada, pero me ahorró medio día de trabajo, ¡así que espero que haga lo mismo por otra persona!
fuente
Que yo sepa,
--hard
descartará los cambios no confirmados. Dado que estos no son rastreados por git. pero puedes deshacer eldiscarded commit
.listas de voluntad:
donde
4bac331
está eldiscarded commit
.Ahora solo mueve la cabeza a ese commit ::
fuente
Ejemplo de caso IRL:
$ git fsck --lost-found
$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a
$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a
fuente
En la mayoría de los casos, sí.
Dependiendo del estado en que se encontraba su repositorio cuando ejecutó el comando, los efectos
git reset --hard
pueden variar desde triviales hasta deshacer, hasta básicamente imposibles.A continuación, he enumerado una serie de diferentes escenarios posibles y cómo puede recuperarse de ellos.
¡Todos mis cambios fueron confirmados, pero ahora los compromisos se han ido!
Esta situación generalmente ocurre cuando se ejecuta
git reset
con un argumento, como engit reset --hard HEAD~
. ¡No se preocupe, esto es fácil de recuperar!Si acabas de correr
git reset
y no has hecho nada más desde entonces, puedes volver a donde estabas con esta frase:Esto restablece su rama actual en cualquier estado en el que se encontraba antes de la última vez que se modificó (en su caso, la modificación más reciente a la rama sería el restablecimiento completo que está intentando deshacer).
Sin embargo, si ha realizado otras modificaciones en su rama desde el reinicio, el unicelino anterior no funcionará. En su lugar, debe ejecutar para ver una lista de todos los cambios recientes realizados en su rama (incluidos los reinicios). Esa lista se verá más o menos así:
git reflog
<branchname>
Encuentre la operación en esta lista que desea "deshacer". En el ejemplo anterior, sería la primera línea, la que dice "reset: mover a HEAD ~". Luego copie la representación del commit antes (abajo) de esa operación. En nuestro caso, sería
master@{1}
(o3ae5027
ambos representan la misma confirmación) y se ejecutarágit reset --hard <commit>
para restablecer su rama actual a esa confirmación.Organicé mis cambios con
git add
, pero nunca me comprometí. ¡Ahora mis cambios se han ido!Esto es un poco más difícil de recuperar. Git hace tener copias de los archivos que ha añadido, pero dado que estos ejemplares no estaban atados a ninguna confirmación en concreto no se puede restaurar los cambios que todos a la vez. En su lugar, debe ubicar los archivos individuales en la base de datos de git y restaurarlos manualmente. Puedes hacer esto usando
git fsck
.Para obtener detalles sobre esto, consulte Deshacer git reset: duro con archivos no confirmados en el área de preparación .
Tuve cambios en los archivos de mi directorio de trabajo con los que nunca me preparé
git add
y nunca los comprometí. ¡Ahora mis cambios se han ido!UH oh. Odio decirte esto, pero probablemente no tengas suerte. git no almacena cambios que no agrega o confirma, y de acuerdo con la documentación para
git reset
:Es posible que pueda recuperar sus cambios con algún tipo de utilidad de recuperación de disco o con un servicio profesional de recuperación de datos, pero en este punto eso probablemente sea más problema de lo que vale.
fuente
Si aún no ha recogido basura en su repositorio (por ejemplo, usando
git repack -d
ogit gc
, pero tenga en cuenta que la recolección de basura también puede ocurrir automáticamente), entonces su confirmación todavía está allí, ya no es accesible a través de HEAD.Puede intentar encontrar su confirmación mirando a través de la salida de
git fsck --lost-found
.Las versiones más nuevas de Git tienen algo llamado "reflog", que es un registro de todos los cambios que se realizan en las referencias (a diferencia de los cambios que se realizan en el contenido del repositorio). Entonces, por ejemplo, cada vez que cambie su CABEZA (es decir, cada vez que haga un
git checkout
cambio de rama) se registrará. Y, por supuesto,git reset
también manipulaste la CABEZA, por lo que también se registró. Puede acceder a los estados más antiguos de sus referencias de una manera similar a la que puede acceder a los estados más antiguos de su repositorio, utilizando un@
signo en lugar de un~
, comogit reset HEAD@{1}
.Me tomó un tiempo entender cuál es la diferencia entre HEAD @ {1} y HEAD ~ 1, así que aquí hay una pequeña explicación:
Entonces,
HEAD~1
significa "ir al commit antes del commit al que HEAD apunta actualmente", mientras queHEAD@{1}
significa "ir al commit que HEAD señaló antes de apuntar a donde apunta actualmente".Eso te permitirá encontrar fácilmente tu commit perdido y recuperarlo.
fuente
Antes de responder, agreguemos algunos antecedentes, explicando qué es esto
HEAD
.First of all what is HEAD?
HEAD
es simplemente una referencia a la confirmación actual (más reciente) en la rama actual.Solo puede haber una sola
HEAD
en un momento dado. (excluyendogit worktree
)El contenido de
HEAD
se almacena dentro.git/HEAD
y contiene los 40 bytes SHA-1 de la confirmación actual.detached HEAD
Si no está en la última confirmación, lo que significa que
HEAD
apunta a una confirmación previa en la historia se llamadetached HEAD
.En la línea de comando se verá así: SHA-1 en lugar del nombre de la rama ya
HEAD
que no apunta a la punta de la rama actualAlgunas opciones sobre cómo recuperarse de un HEAD separado:
git checkout
Esto verificará que la nueva rama apunte a la confirmación deseada.
Este comando pagará a un commit dado.
En este punto, puede crear una rama y comenzar a trabajar a partir de este momento.
git reflog
Siempre puedes usar el
reflog
también.git reflog
mostrará cualquier cambio que haya actualizadoHEAD
y revisando la entrada de reflog deseada establecerá elHEAD
respaldo de este commit.Cada vez que se modifique el HEAD habrá una nueva entrada en el
reflog
Esto lo llevará de regreso a su compromiso deseado
git reset HEAD --hard <commit_id>
"Mueva" su cabeza hacia atrás al compromiso deseado.
también puedes usar el
git rebase --no-autostash
.git revert <sha-1>
"Deshacer" el compromiso o rango de compromiso dado.
El comando reset "deshacerá" cualquier cambio realizado en el commit dado.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.
Este esquema ilustra qué comando hace qué.
Como puede ver allí
reset && checkout
modifique elHEAD
.fuente
git reset HEAD --hard <commit_id>
ejemplo está tomado de stackoverflow.com/questions/4114095/… - Si ese es el caso, ¿podría editarlo en la atribución?git reflog
git cherry-pick <the sha>
fuente
Sé que este es un hilo viejo ... pero como muchas personas están buscando formas de deshacer cosas en Git, sigo pensando que puede ser una buena idea continuar dando consejos aquí.
Cuando haces un "git add" o mueves algo desde la parte superior izquierda a la parte inferior izquierda en git gui, el contenido del archivo se almacena en un blob y el contenido del archivo es posible recuperar de ese blob.
Por lo tanto, es posible recuperar un archivo incluso si no se confirmó pero debe haberse agregado.
Ahora se crea el blob pero el índice hace referencia a él, por lo que no aparecerá en la lista con git fsck hasta que lo reiniciemos. Entonces reiniciamos ...
obtendrá un blob colgante ce013625030ba8dba906f756967f9e9ca394464a
le devolverá el contenido del archivo "hola"
Para encontrar confirmaciones no referenciadas, encontré un consejo en algún lugar que sugiere esto.
Lo tengo como herramienta en git gui y es muy útil.
fuente
git fsck --lost-found
puede ayudar.Si está utilizando un IDE de JetBrains (cualquier cosa basada en IntelliJ), puede recuperar incluso sus cambios no confirmados a través de su función "Historial local".
Haga clic derecho en su directorio de nivel superior en su árbol de archivos, busque "Historial local" en el menú contextual y elija "Mostrar historial". Esto abrirá una vista donde se pueden encontrar sus ediciones recientes, y una vez que haya encontrado la revisión a la que desea volver, haga clic derecho sobre ella y haga clic en "Revertir".
fuente
Acabo de hacer un restablecimiento completo en un proyecto incorrecto. Lo que me salvó la vida fue la historia local de Eclipse. Se dice que IntelliJ Idea también tiene uno, y también su editor, vale la pena verificarlo:
fuente
Hice un pequeño script para que sea un poco más fácil encontrar el commit que está buscando:
git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'
Sí, se puede hacer mucho más bonito con awk o algo así, pero es simple y solo lo necesitaba. Podría salvar a otra persona 30 segundos.
fuente
Mi problema es casi similar. Tengo archivos no confirmados antes de ingresar
git reset --hard
.Agradecidamente. Logré omitir todos estos recursos. Después me di cuenta de que solo puedo deshacer (
ctrl-z
). 😊 Solo quiero agregar esto a todas las respuestas anteriores.Nota. No es posible
ctrl-z
abrir archivos sin abrir.fuente
Esto me ha salvado la vida:
https://medium.com/@CarrieGuss/how-to-recover-from-a-git-hard-reset-b830b5e3f60c
Básicamente necesitas ejecutar:
Luego, manualmente pasando por el dolor para reorganizar sus archivos a la estructura correcta.
Para llevar: nunca lo use
git reset --hard
si no comprende completamente al 100% cómo funciona, mejor no usarlo.fuente