¡No es un duplicado de las preguntas relacionadas --hard! El riesgo de ejecutar accidentalmente este comando es mucho mayor. Por ejemplo, desea quitar el escenario de un solo archivo con git reset foo-file. Solo escribe la primera parte del nombre de archivo, presione la pestaña para autocompletar, en realidad se completa con un nombre de rama, no lo nota y ejecuta el comando en su git reset foo-branchlugar. Voilà
Yushin Washio
Respuestas:
2391
Respuesta corta:
git reset 'HEAD@{1}'
Respuesta larga:
Git mantiene un registro de todas las actualizaciones de referencia (por ejemplo, pago, reinicio, confirmación, fusión). Puede verlo escribiendo:
git reflog
En algún lugar de esta lista está el compromiso que perdiste. Digamos que acabas de escribir git reset HEAD~y quieres deshacerlo. Mi reflog se ve así:
$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]
La primera línea dice que hace HEAD0 posiciones (en otras palabras, la posición actual) es 3f6db14; se obtuvo restableciendo a HEAD~. La segunda línea dice que hace HEAD1 posición (en otras palabras, el estado antes del reinicio) es d27924e. Se obtuvo al verificar una confirmación particular (aunque eso no es importante en este momento). Entonces, para deshacer el restablecimiento, ejecute git reset HEAD@{1}(o git reset d27924e).
Si, por otro lado, ha ejecutado algunos otros comandos desde entonces que actualizan HEAD, la confirmación que desea no estará en la parte superior de la lista, y deberá buscar a través de reflog.
Una nota final: puede ser más fácil mirar la reflograma específica que desea restablecer, digamos master, en lugar de HEAD:
Como una alternativa más visual y más agradable reflogpara este propósito, me gusta usar git log --graph --decorate --oneline $(git rev-list -g --all). Muestra un árbol de todos los commits, incluidas las ramas colgantes sin nombre
texasflood
1
Digamos que tengo un directorio con archivos existentes. En este directorio ejecuto git init, y luego justo después de eso git reset --hard. No hay reflog, o incluso ningún registro para empezar. ¿Son estos archivos bastante tostados ahora?
AlanSE
@AlanSE, lamentablemente esos archivos son tostados, que yo sepa. Si nunca lo ha hecho git add(es decir, nunca ha montado esa versión del archivo), entonces git checkouto git reset --hardeliminará la única copia (el directorio de trabajo) sin copia de seguridad. Ojalá no fuera así.
Mark Lodato
2
git reset HEAD~12oops ... git reset HEAD@{12}nooo ... 'git reflog' al rescate! oh, es sologit reset HEAD@{1}
Esto parece genial, ¿podrías elaborar? ¿"ORIG" es aquí abreviatura de "original" o "origen"? ... Es decir, ¿se restablece a donde estaba HEAD antes de comenzar a usarlo? ¿O a dónde está HEAD en el origen? ¿Qué sucede si has movido HEAD varias veces antes del git reset ORIG_HEAD? Gracias.
Benjohn
ORIG significa original, ORIG_HEAD significa HEAD original, antes del reinicio
Sam Gallagher
"Ciertas operaciones, como fusionar y restablecer, registran la versión anterior de HEAD en ORIG_HEAD justo antes de ajustarla a un nuevo valor. Puede usar ORIG_HEAD para recuperar o volver al estado anterior o para hacer una comparación". Extracto del libro: "Control de versiones con Git"
Amirreza
56
Mi situación era ligeramente diferente, lo hice git reset HEAD~ tres veces.
Para deshacerlo tuve que hacer
git reset HEAD@{3}
entonces deberías poder hacer
git reset HEAD@{N}
Pero si has hecho git reset usando
git reset HEAD~3
deberás hacer
git reset HEAD@{1}
Como {N} representa el número de operaciones en Reflog. Como Mark señaló en los comentarios.
la opción aceptada no proporciona un ejemplo de cómo avanzar NI estuvo en una situación hace una hora en la que quería reenviar más de 1. Intenté con múltiples y funcionó. Quería agregar eso aquí. Será útil para las personas que buscan deshacer el restablecimiento con git reset HEAD ~ 3
zainengineer
3
pero si alguien ha hecho git reset HEAD ~ 3 puede ver rápidamente cómo deshacerlo, se requiere git reset HEAD @ {3} sin tener que volver a registrar git reset HEAD ~ 3, etc. es una situación común
zainengineer
1
Creo que cualquiera que vea {1} / {2} se daría cuenta de que el número podría ser cualquier número de revisión, que el reflogcomando le proporciona. Estuvo de acuerdo en que su punto sobre los números son los mismos para cualquier dirección ~ 3 / @ {3}, pero realmente no necesitaba ser una nueva respuesta.
Clint
30
1.Utilice git reflog para obtener todas las referencias actualizadas.
--hard
! El riesgo de ejecutar accidentalmente este comando es mucho mayor. Por ejemplo, desea quitar el escenario de un solo archivo congit reset foo-file
. Solo escribe la primera parte del nombre de archivo, presione la pestaña para autocompletar, en realidad se completa con un nombre de rama, no lo nota y ejecuta el comando en sugit reset foo-branch
lugar. VoilàRespuestas:
Respuesta corta:
Respuesta larga:
Git mantiene un registro de todas las actualizaciones de referencia (por ejemplo, pago, reinicio, confirmación, fusión). Puede verlo escribiendo:
En algún lugar de esta lista está el compromiso que perdiste. Digamos que acabas de escribir
git reset HEAD~
y quieres deshacerlo. Mi reflog se ve así:La primera línea dice que hace
HEAD
0 posiciones (en otras palabras, la posición actual) es 3f6db14; se obtuvo restableciendo aHEAD~
. La segunda línea dice que haceHEAD
1 posición (en otras palabras, el estado antes del reinicio) es d27924e. Se obtuvo al verificar una confirmación particular (aunque eso no es importante en este momento). Entonces, para deshacer el restablecimiento, ejecutegit reset HEAD@{1}
(ogit reset d27924e
).Si, por otro lado, ha ejecutado algunos otros comandos desde entonces que actualizan HEAD, la confirmación que desea no estará en la parte superior de la lista, y deberá buscar a través de
reflog
.Una nota final: puede ser más fácil mirar la
reflog
rama específica que desea restablecer, digamos master, en lugar deHEAD
:Esto debería tener menos ruido que el general
HEAD reflog
.fuente
reflog
para este propósito, me gusta usargit log --graph --decorate --oneline $(git rev-list -g --all)
. Muestra un árbol de todos los commits, incluidas las ramas colgantes sin nombregit init
, y luego justo después de esogit reset --hard
. No hay reflog, o incluso ningún registro para empezar. ¿Son estos archivos bastante tostados ahora?git add
(es decir, nunca ha montado esa versión del archivo), entoncesgit checkout
ogit reset --hard
eliminará la única copia (el directorio de trabajo) sin copia de seguridad. Ojalá no fuera así.git reset HEAD~12
oops ...git reset HEAD@{12}
nooo ... 'git reflog' al rescate! oh, es sologit reset HEAD@{1}
Antigua pregunta, y las respuestas publicadas funcionan muy bien. Sin embargo, hablaré con otra opción.
git reset ORIG_HEAD
ORIG_HEAD
hace referencia al commit al queHEAD
se hizo referencia anteriormente.fuente
git reset ORIG_HEAD
? Gracias.Mi situación era ligeramente diferente, lo hice
git reset HEAD~
tres veces.Para deshacerlo tuve que hacer
entonces deberías poder hacer
Pero si has hecho git reset usando
deberás hacer
Como {N} representa el número de operaciones en Reflog. Como Mark señaló en los comentarios.
fuente
reflog
comando le proporciona. Estuvo de acuerdo en que su punto sobre los números son los mismos para cualquier dirección ~ 3 / @ {3}, pero realmente no necesitaba ser una nueva respuesta.1.Utilice
git reflog
para obtener todas las referencias actualizadas.2)
git reset <id_of_commit_to_which_you_want_restore>
fuente