Alguien aceptó una solicitud de extracción que no deberían haber recibido. Ahora tenemos un montón de código roto fusionado. ¿Cómo deshacer una solicitud de extracción? Iba a revertir los cambios al commit justo antes de la fusión, pero noté que se fusionó en un montón de commits. Así que ahora hay todos estos compromisos de esta persona desde días antes de la fusión. ¿Cómo deshaces esto?
git
github
merge
pull-request
Será
fuente
fuente
Respuestas:
Hay una mejor respuesta a este problema, aunque podría desglosarlo paso a paso.
Deberá buscar y verificar los últimos cambios ascendentes, por ejemplo:
Echando un vistazo al registro de confirmación, debería encontrar algo similar a esto:
Ahora desea revertir toda la solicitud de extracción con la capacidad de revertir más tarde. Para hacerlo, deberá tomar la ID de la confirmación de fusión .
En el ejemplo anterior, la confirmación de fusión es la principal donde dice "Solicitud de extracción fusionada # 123 ..." .
Haga esto para revertir los dos cambios ( "Agregar barra" y "Agregar foo" ) y terminará en una confirmación revocando toda la solicitud de extracción que puede volver a anular más adelante y mantener limpio el historial de cambios:
fuente
git checkout upstream/master -b revert/john/foo_and_bar
? ¿Qué hace exactamente?Mire su gráfico de compromiso (con gitk o un programa similar). Verá confirmaciones de la solicitud de extracción, y verá sus propias confirmaciones y una confirmación de fusión (si no fue una combinación de avance rápido). Solo tiene que encontrar el último de sus propios commits antes de la fusión y restablecer la rama a este commit.
(Si tiene el reflog de la rama, debería ser aún más fácil encontrar el commit antes de la fusión).
(Editar después de más información en los comentarios :)
Bien, veamos el gráfico:
Supongo que la última confirmación (más a la derecha) fue su fusión incorrecta por solicitud de extracción , que fusionó la línea azul que se ve aquí. Su última buena confirmación sería la anterior en la línea negra, aquí marcada en rojo:
Restablezca esta confirmación, y debería estar bien.
Esto significa que en su copia de trabajo local haga esto (después de asegurarse de que no tiene más cosas sin confirmar, por ejemplo, por git stash):
Ahora confirme que realmente está en la confirmación que marqué allí, y no verá ninguna de las cosas extraídas en su ascendencia.
(si su control remoto de github se llama
origin
, de lo contrario cambie el nombre).Ahora todo debería verse bien en Github también. Los commits aún estarán en su repositorio, pero ninguna rama podrá acceder a ellos, por lo que no debería causar ningún daño allí. (Y seguirán en el repositorio de RogerPaladin, por supuesto).
(Puede haber una forma específica de Github solo en la web para hacer lo mismo, pero no estoy muy familiarizado con Github y su sistema de gestión de solicitudes de extracción).
Tenga en cuenta que si alguien más podría haber extraído a su maestro con el commit incorrecto, entonces tienen el mismo problema que usted tiene actualmente y realmente no pueden contribuir de nuevo. antes de reiniciar a su nueva versión maestra.
Si es probable que esto haya sucedido, o simplemente desea evitar cualquier problema, use el
git revert
comando en lugar degit reset
, para revertir los cambios con una nueva confirmación, en lugar de volver a establecer una anterior. (Algunas personas piensan que nunca debería reiniciar con las ramas publicadas). Vea otras respuestas a esta pregunta sobre cómo hacerlo.Para el futuro:
Si solo desea algunos de los commits de la rama de RogerPaladin, considere usar en
cherry-pick
lugar demerge
. O comuníquese con RogerPaladin para moverlos a una sucursal separada y enviar una nueva solicitud de extracción.fuente
reset --hard
y un empuje forzado es muy mala práctica.) La respuesta de @errordeveloper a continuación muestra una forma de hacerlo sin necesidad de reescribir la historia o forzar la presión.Si el tirón fue lo último que hizo, entonces
fuente
git reset --hard HEAD~1
, solíagit push origin -f
actualizar el repositorio remoto. Pero tenga cuidado, tenga cuidado antes de hacer esto.A partir del 24 de junio de 2014, puede intentar cancelar un RP fácilmente (consulte " Revertir una solicitud de extracción ") con:
Presentando el botón Revertir
Sin embargo, queda por probar si esa reversión se usa
-m
o no (para revertir fusiones también)Pero Adil H Raza agrega en los comentarios (diciembre de 2019):
Advertencia : Korayem señala en los comentarios que:
Korayem nos remite a " Github: cambios ignorados después de revertir (
git cherry-pick
,git rebase
) " para obtener más información.fuente
Para deshacer una solicitud de extracción de github con confirmaciones que no desea eliminar, debe ejecutar:
git reset --hard --merge <commit hash>
siendo el hash commit el commit ANTES de fusionar la solicitud de extracción. Esto eliminará todas las confirmaciones de la solicitud de extracción sin influir en ninguna confirmación dentro del historial.
Una buena manera de encontrar esto es ir a la solicitud de extracción ahora cerrada y encontrar este campo:
Imagen de solicitud de extracción
Después de ejecutar el
git reset
, ejecute un:git push origin --force <branch name>
Esto debería revertir la bifurcación antes de que la solicitud de extracción SIN afectar los commits en la rama salpicado en el historial de confirmaciones entre confirmaciones de la solicitud de extracción.
EDITAR:
Si tuviera que hacer clic en el botón de reversión en la solicitud de extracción, esto crea una confirmación adicional en la rama. NO se deshace ni se deshace. Esto significa que si presiona el botón revertir, no puede abrir una nueva solicitud de extracción para volver a agregar todo este código.
fuente
Uso este lugar todo el tiempo, gracias.
Estaba buscando cómo deshacer una solicitud de extracción y llegué aquí.
Estaba a punto de
git reset --hard
"hace mucho tiempo" y retrocedí rápidamente a donde estaba antes de hacer la solicitud de extracción.Además de mirar aquí, también le pregunté a mi compañero de trabajo qué haría, y él tuvo una respuesta típicamente buena: usando el resultado de ejemplo en la primera respuesta anterior:
Como con la mayoría de las cosas en Git, si lo estás haciendo de alguna manera que no es fácil, probablemente lo estés haciendo mal.
fuente