Deshacer una fusión por request de extracción?

Alguien aceptó una request de extracción que no deberían tener. Ahora tenemos un montón de códigos rotos fusionados. ¿Cómo se puede deshacer una request de extracción? Iba a revertir los cambios a la confirmación justo antes de la fusión, pero noté que se fusionó en un montón de confirmaciones. Entonces ahora hay todos estos compromisos de esta persona desde días antes de la fusión. ¿Cómo deshaces esto?

Hay una mejor respuesta para este problema, aunque podría desglosarlo paso a paso.

Tendrá que ir y search los últimos cambios en la cadena ascendente, como por ejemplo:

git fetch upstream git checkout upstream/master -b revert/john/foo_and_bar 

Echando un vistazo al logging de compromiso, debe encontrar algo similar a esto:

 commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269 Merge: 9271e6e a507888 Author: Tim Tom <tim@tom.com> Date: Mon Apr 29 06:12:38 2013 -0700 Merge pull request #123 from john/foo_and_bar Add foo and bar commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e Author: John Doe <john@doe.com> Date: Mon Apr 29 12:13:29 2013 +0000 Add bar commit 470ee0f407198057d5cb1d6427bb8371eab6157e Author: John Doe <john@doe.com> Date: Mon Apr 29 10:29:10 2013 +0000 Add foo 

Ahora desea revertir la request de extracción completa con la capacidad de no volver a aparecer más tarde. Para hacerlo, deberá tomar el ID de la confirmación de fusión .

En el ejemplo anterior, la confirmación de fusión es la más alta donde dice "request de extracción fusionada # 123 …" .

Haga esto para revertir los dos cambios ( "Agregar barra" y "Agregar foo" ) y terminará con una confirmación que revierte toda la request de extracción que puede deshacer más adelante y mantener limpio el historial de cambios:

 git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269 

Mire su gráfico de compromiso (con gitk o un progtwig similar). Verá commits desde la request de extracción, y verá sus propios commits, y un commit de fusión (si no fue una fusión de avance rápido). Solo tienes que encontrar el último de tus commits antes de la fusión, y restablecer la twig a este commit.

(Si tiene el reflog de la sucursal, debería ser aún más fácil encontrar la confirmación antes de la fusión).


(Editar después de más información en comentarios 🙂

De acuerdo, veamos el gráfico:

captura de pantalla 1

Supongo que la última confirmación (más a la derecha) fue la fusión incorrecta por request de extracción , que fusionó la línea azul que se ve aquí. Su último compromiso correcto sería el anterior en la línea negra, aquí marcado en rojo:

enter image description here

Restablece este compromiso, y deberías estar bien.

Esto significa que, en su copy de trabajo local, haga esto (después de asegurarse de no tener más elementos no comprometidos, por ejemplo, por git stash):

 git checkout master git reset --hard 7a62674ba3df0853c63539175197a16122a739ef gitk 

Ahora confirma que realmente estás en la confirmación que marqué allí, y no verás ninguna de las cosas arrastradas en su ascendencia.

 git push -f origin master 

(si su control remoto github se llama origin – de lo contrario cambie el nombre).

Ahora todo debería quedar bien en github, también. Los commits seguirán estando en tu repository, pero no accesibles por ninguna twig, por lo tanto no deberían hacer daño allí. (Y todavía estarán en el repository de RogerPaladin, por supuesto).

(Puede haber una forma específica de solo Github para hacer lo mismo en la web, pero no estoy demasiado familiarizado con Github y su sistema de gestión de requestes de extracción).

Tenga en count que si alguien más ya pudo haber sacado su maestro con la confirmación incorrecta, entonces tienen el mismo problema que tiene actualmente, y realmente no pueden contribuir. antes de restablecer a su nueva versión maestra.

Si es probable que esto ocurra, o si simplemente desea evitar cualquier problema, use el command git revert lugar de git reset , para revertir los cambios con un nuevo compromiso, en lugar de volver a establecer uno anterior. (Algunas personas piensan que nunca debe reiniciar con las twigs publicadas). Consulte otras respuestas a esta pregunta sobre cómo hacer esto.

Para el futuro:

Si solo desea algunas de las confirmaciones de la sucursal de RogerPaladin, considere usar cherry-pick lugar de merge . O comuníquese con RogerPaladin para moverlos a una sucursal separada y enviar una nueva request de extracción.

Si el tirón fue lo último que hizo, entonces

 git reset --hard HEAD~1 

A partir del 24 de junio de 2014, puede intentar cancelar un PR fácilmente (consulte " Revertir una request de extracción ") con:

Presentamos el button Revertir

puede revertir fácilmente una request de extracción en GitHub haciendo clic en Revertir:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

Se le pedirá que cree una nueva request de extracción con los cambios revertidos:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

Sin embargo, queda por probar si esa reversión utiliza -m o no (para revertir fusiones también)

Para deshacer una request de extracción de github con confirmaciones que no desea eliminar, debe ejecutar una:

git reset --hard --merge <commit hash>

con el hash de confirmación siendo el compromiso ANTES de fusionar la request de extracción. Esto eliminará todas las confirmaciones de la request de extracción sin influir en ninguna confirmación dentro del historial.

Una buena forma de encontrar esto es ir a la request de extracción ahora cerrada y encontrar este campo:

Pull Request Image Pull Request Image

Después de ejecutar el git reset , ejecute un:

git push origin --force <branch name>

Esto debería revertir la twig hacia atrás antes de que la request de extracción SIN afectar las confirmaciones en la twig salpicada en el historial de confirmación entre las confirmaciones de la request de extracción.

EDITAR:

Si hiciera clic en el button de revertir en la request de extracción, esto crea una confirmación adicional en la twig. NO se compromete o no. Esto significa que si toca el button de revertir, no puede abrir una nueva request de extracción para volver a agregar todo este código.

Uso este lugar todo el time, gracias.

Estaba buscando cómo deshacer una request de extracción y he llegado aquí.

Estaba a punto de git reset --hard mucho time y hacer un rápido avance hacia donde estaba antes de hacer la request de extracción.

Además de mirar aquí, también le pregunté a mi compañero de trabajo qué haría, y tuvo una respuesta típicamente buena: usando el resultado del ejemplo en la primera respuesta anterior:

 git reset --hard 9271e6e 

Al igual que con la mayoría de las cosas en Git, si lo haces de una manera que no es fácil, probablemente lo estés haciendo mal.