Deshacer git pull, cómo llevar repos al estado anterior
-
11-07-2019 - |
Pregunta
¿Hay alguna forma de revertir o deshacer git pull para que mi fuente / repos recupere el estado anterior que tenía antes de hacer git pull? Quiero hacer esto porque fusionó algunos archivos que no quería, pero solo fusionó otros archivos restantes. Entonces, quiero recuperar esos archivos, ¿es eso posible? Gracias :)
EDITAR Quiero deshacer git merge para aclararlo. Después de ver algunas respuestas, hice esto
git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...
Ahora, ¿qué debo hacer? ¿Hacer git reset --hard
está bien? No quiero volver a atornillarlo, ¿así que pide pasos detallados?
Solución
git pull
hará dos cosas: realiza una git fetch
y luego una git merge
donde fusiona las ramas que se han configurado para fusionarse en su configuración.
Entonces, lo que quiere hacer es deshacer la fusión (deshacer la búsqueda no tiene mucho sentido y no debería ser necesario).
Para hacerlo, puede intentar usar git reset --hard
para restablecer un estado anterior. Utilice el comando git-reflog para encontrar el SHA-1 del estado anterior y luego restablecerlo.
Advertencia : git reset --hard
elimina todos los cambios no confirmados.
Otros consejos
Igual que la respuesta de jkp, pero aquí está el comando completo:
git reset --hard a0d3fe6
donde se encuentra a0d3fe6 haciendo
git reflog
y mirando el punto en el que desea deshacer.
Una forma más moderna de deshacer una fusión es:
git merge --abort
Y la forma un poco más antigua:
git reset --merge
La forma de la vieja escuela descrita en respuestas anteriores (advertencia: descartará todos los cambios locales):
git reset --hard
Pero en realidad, vale la pena notar que git merge --abort
solo es equivalente a git reset --merge
dado que MERGE_HEAD
es presente. Esto se puede leer en el comando git help for merge.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
Después de una fusión fallida, cuando no hay MERGE_HEAD
, la fusión fallida se puede deshacer con git reset --merge
pero no necesariamente con git merge - -abort
, para que no solo sean una sintaxis antigua y nueva para la misma cosa . Es por eso que encuentro que git reset --merge
es mucho más útil en el trabajo diario.
funciona
primer uso: git reflog
encuentre su SHA de su estado anterior y cree (HEAD @ {1} es un ejemplo)
git reset --hard HEAD@{1}
Si tiene gitk (intente ejecutar " gitk --todos desde la línea de comandos de git "), es simple. Simplemente ejecútelo, seleccione la confirmación a la que desea revertir (haga clic con el botón derecho) y seleccione "Restablecer rama maestra aquí". Si no tiene cambios no confirmados, elija el "duro" opción.
Suponga que $ COMMIT
fue la última identificación de confirmación antes de realizar git pull
.
Lo que necesita para deshacer el último tirón es
git reset --hard $ COMMIT
.
Bonus:
Al hablar de pull, me gustaría compartir un truco interesante,
git pull --rebase
Este comando anterior es el comando más útil en mi vida git que ahorró mucho tiempo.
Antes de enviar su nueva confirmación al servidor, pruebe este comando y sincronizará automáticamente los últimos cambios del servidor (con una búsqueda + fusión) y colocará su confirmación en la parte superior del registro de git. No necesita preocuparse por la extracción / fusión manual.
Encuentre detalles en: http://gitolite.com/git-pull--rebase
puedes hacer git reset --hard ORIG_HEAD
desde " pull " o "fusionar" establezca ORIG_HEAD para que sea el estado actual antes de realizar esas acciones.
Esta es la forma más fácil de revertir los cambios de extracción.
git reset --hard 9573e3e0
Donde 9573e3e0
es su {Commit id}
Si hay una fusión fallida, que es la razón más común para querer deshacer un git pull
, ejecutar git reset --merge
hace exactamente lo que uno esperaría : mantenga los archivos recuperados, pero deshaga la fusión que git pull
intentó fusionar. Entonces uno puede decidir qué hacer sin el desorden que a veces genera git merge
. Y no necesita uno para encontrar la ID de confirmación exacta que requiere --hard
en todas las demás respuestas.