¿Cómo deshacer 'git reset'?

1314

¿Cuál es la forma más sencilla de deshacer el

git reset HEAD~

¿mando? Actualmente, la única forma en que puedo pensar es haciendo un "git clone http: // ..." desde un repositorio remoto.

Andriy Drozdyuk
fuente
2
Si alguien está buscando cómo deshacer un restablecimiento completo , marque Deshacer un restablecimiento git --hard HEAD ~ 1 . Las soluciones son muy similares.
1
Posible duplicado de ¿Cómo puedo deshacer git reset --hard HEAD ~ 1?
underscore_d
2
¡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:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Esto debería tener menos ruido que el general HEAD reflog.

Mark Lodato
fuente
25
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}
Dennis
Después de leer el excelente artículo de git-scm.com/blog/2011/07/11/reset.html git-reset, estoy un poco menos desconcertado.
Andriy Drozdyuk
192

Antigua pregunta, y las respuestas publicadas funcionan muy bien. Sin embargo, hablaré con otra opción.

git reset ORIG_HEAD

ORIG_HEADhace referencia al commit al que HEADse hizo referencia anteriormente.

Dan Fischer
fuente
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.

zainengineer
fuente
2
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.

2)git reset <id_of_commit_to_which_you_want_restore>

omilus
fuente