¿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?
EDITAR: Quiero deshacer git merge para aclaraciones. Después de ver algunas respuestas, hice esto
git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...
Y ahora que debo hacer ? ¿Hacer git reset --hard
está bien? No quiero volver a atornillarlo, ¿así que pide pasos detallados?
git
version-control
git-merge
seg.server.fault
fuente
fuente
git reset --hard 01b34fa
en este caso, podría haber hecho logit reset --hard HEAD^
que se restablece a un commit antes de HEAD.git reflog
mostrará todo lo que se ha hecho con git. Existe una preocupación quegit reset --hard [sha1 of something from reflog]
revertirá todo lo que se muestrareflog
, que a veces no es un objetivo, por ejemplo. desea revertir la fusión en la rama maestra extraída del origen con datos incorrectos (sucede), y después de esa fusión ha trabajado en otras ramas.reflog
mostrará cada cambio en otras ramas. Perogit checkout master
ygit reset --hard [SH1 of commit on master branch just before merge]
restablecerá solo la rama maestra actual eliminando la fusión extraída del origen.Respuestas:
Running
git pull
ejecuta las siguientes tareas, en orden:git fetch
git merge
El paso de combinación combina ramas que se han configurado para fusionarse en su configuración. Desea deshacer el paso de fusión , pero probablemente no sea la búsqueda (no tiene mucho sentido y no debería ser necesario).
Para deshacer la fusión , use
git reset --hard
para restablecer el repositorio local a un estado anterior; use git-reflog para encontrar el SHA-1 del estado anterior y luego reinícielo.Advertencia
Los comandos enumerados en esta sección eliminan todos los cambios no confirmados, lo que puede conducir a una pérdida de trabajo:
Alternativamente, restablezca a un punto particular en el tiempo, como:
fuente
master@{1}
, que es la posición previa demaster
,master@{"5 minutes ago"}
omaster@{14:30}
. Los detalles completos sobre la especificación de revisiones de esta manera se pueden encontrarman git-rev-parse
en la sección llamada "especificación de revisiones".Updating d2c90a3..035ac4d
. Aquí, también puede usard2c90a3
como parámetro para restablecer.Igual que la respuesta de jkp, pero aquí está el comando completo:
donde a0d3fe6 se encuentra haciendo
y mirando el punto en el que desea deshacer.
fuente
git reset HEAD --hard
, por ejemplo?git reset --hard HEAD@{n}
funcionógit reflog
: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} y bbbbbbb HEAD @ {2}. Si lo hagogit reset --hard bbbbbbb
, ¿perderé el HEAD 0 y 1?Una forma más moderna de deshacer una fusión es:
Y la forma un poco más antigua:
La forma de la vieja escuela descrita en respuestas anteriores (advertencia: descartará todos los cambios locales):
Pero en realidad, vale la pena notar que
git merge --abort
solo es equivalente a logit reset --merge
dado queMERGE_HEAD
está presente. Esto se puede leer en el comando git help for merge.Después de una fusión fallida, cuando no existe
MERGE_HEAD
, la fusión fallida se puede deshacergit reset --merge
pero no necesariamente congit merge --abort
, por lo que no solo son sintaxis antiguas y nuevas para la misma cosa . Es por eso que encuentrogit reset --merge
mucho más útil en el trabajo diario.fuente
git merge --abort
funciona DURANTE una fusión, no después de quegit pull
haya terminado. Entonces esta respuesta parece irrelevante para la pregunta.git reset --merge
elimina todos los cambios no organizados para la confirmación. Descubrí esto de la manera difícil.funciona primer uso:
git reflog
encuentre su SHA de su estado anterior y haga (HEAD @ {1} es un ejemplo)
fuente
Si tiene gitk (intente ejecutar "gitk --todos desde su línea de comando 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 la rama maestra aquí". Si no tiene cambios no confirmados, elija la opción "difícil".
fuente
Supongamos que
$COMMIT
fue la última identificación de confirmación antes de realizargit pull
. Lo que necesitas para deshacer el último tirón esgit reset --hard $COMMIT
.
Prima:
Al hablar de atracción, 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 en el registro de git. No necesita preocuparse por la extracción / fusión manual.
Encuentre detalles en: http://gitolite.com/git-pull--rebase
fuente
Esta es la forma más fácil de revertir los cambios de extracción.
Realice una copia de seguridad de sus archivos modificados porque eliminará los archivos y carpetas recién creados .
¿Dónde
9573e3e0
está tu {Commit id}fuente
Updating ffce65bd..e929e884
, lo hacemosgit reset --hard ffce65bd
tu puedes hacer
git reset --hard ORIG_HEAD
desde "pull" o "merge" establezca ORIG_HEAD para que sea el estado actual antes de realizar esas acciones.
fuente
git pull hacer debajo de la operación.
Para deshacer pull, haga cualquier operación:
Mejora:
La próxima vez use en
git pull --rebase
lugar degit pull
... su servidor de sincronización cambia haciendo (buscar y fusionar).fuente
Si hay una fusión fallida, que es la razón más común para querer deshacer una
git pull
, la ejecucióngit reset --merge
hace exactamente lo que uno esperaría: mantener los archivos recuperados, pero deshacer la fusión quegit pull
intentó fusionar. Entonces uno puede decidir qué hacer sin el desorden que agit merge
veces genera. Y no necesita uno para encontrar la ID de confirmación exacta que se--hard
menciona en todas las demás respuestas.fuente