¿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 01b34faen este caso, podría haber hecho logit reset --hard HEAD^que se restablece a un commit antes de HEAD.git reflogmostrará 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.reflogmostrará cada cambio en otras ramas. Perogit checkout masterygit 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 pullejecuta las siguientes tareas, en orden:git fetchgit mergeEl 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 --hardpara 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-parseen la sección llamada "especificación de revisiones".Updating d2c90a3..035ac4d. Aquí, también puede usard2c90a3como 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 --abortsolo es equivalente a logit reset --mergedado queMERGE_HEADestá 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 --mergepero 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 --mergemucho más útil en el trabajo diario.fuente
git merge --abortfunciona DURANTE una fusión, no después de quegit pullhaya terminado. Entonces esta respuesta parece irrelevante para la pregunta.git reset --mergeelimina todos los cambios no organizados para la confirmación. Descubrí esto de la manera difícil.funciona primer uso:
git reflogencuentre 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
$COMMITfue 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 --rebaseEste 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
9573e3e0está tu {Commit id}fuente
Updating ffce65bd..e929e884, lo hacemosgit reset --hard ffce65bdtu puedes hacer
git reset --hard ORIG_HEADdesde "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 --rebaselugar 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 --mergehace exactamente lo que uno esperaría: mantener los archivos recuperados, pero deshacer la fusión quegit pullintentó fusionar. Entonces uno puede decidir qué hacer sin el desorden que agit mergeveces genera. Y no necesita uno para encontrar la ID de confirmación exacta que se--hardmenciona en todas las demás respuestas.fuente