Re-fusión repetida en Git

Tenía un problema: tenía sucursales 28s para una tarea específica en Git, que combiné para develop en general. Resulta que lo hice demasiado rápido, así que usé git -revert para deshacer la fusión. Sin embargo, ahora es el momento de combinar los 28s para develop , pero el equipo de git-merge ve la fusión original y anuncia feliz que todo está bien y que las sucursales ya están fusionadas. ¿Qué debo hacer ahora? Crear un "Revertir" Revertir "28s → desarrollar" "cometer"? Parece que esta no es la mejor manera de hacer esto, pero no puedo imaginar ninguna otra en este momento.

Cómo se ve una estructura de árbol:

128
03 июля '09 в 10:15 2009-07-03 10:15 Toms Mikoss preguntó el 3 de julio de 2009 a las 10:15 a.m. 2009-07-03 10:15
@ 5 respuestas

Usted necesita "devolver el revés". Dependiendo de cómo lo hiciste, puede que no sea tan fácil como parece. Ver el documento oficial en esta sección .

 ---o---o---o---M---x---x---W---x---Y / ---A---B-------------------C---D 

para permitir

 ---o---o---o---M---x---x-------x-------* / / ---A---B-------------------C---D 

¿Pero funciona todo? Por supuesto Puede devolver la combinación, y desde un ángulo puramente técnico, git lo hizo de forma muy natural y no tuvo ningún problema real.
Simplemente pensó que era un cambio de "estado a fusión" a "estado después de fusión", y eso fue todo. Nada complicado, nada extraño, nada realmente peligroso. Git hará esto sin siquiera pensarlo.

Por lo tanto, desde un punto de vista técnico, no hay nada de malo en devolver una fusión, pero desde la esquina del flujo de trabajo, esto es lo que generalmente debe tratar de evitar .

Si es posible, por ejemplo, si encuentra un problema que se ha fusionado en el árbol principal y no desea devolver una combinación, intente con fuerza :

  • divida el problema en la rama que fusionó y solo corríjalo,
  • o tratar de devolver la fijación individual que lo causó.

Sí, es más difícil, y no, no siempre funcionará (a veces la respuesta es: "Vaya, realmente no debería haberlo vaciado, porque aún no estaba listo, y realmente necesito cancelar toda la fusión"). Así que realmente debería devolver la fusión, pero si desea volver a realizar la fusión, ahora debe hacerlo devolviendo la devolución.

103
03 июля '09 в 10:35 2009-07-03 10:35 la respuesta está dada por J-16 SDiZ 03 de julio de 2009 a las 10:35 2009-07-03 10:35

Supongamos que tienes tal historia

 ---o---o---o---M---W---x-------x-------* / ---A---B 

Donde A, B no pudo arreglar, y W - devuelve M

Entonces, antes de que comience a solucionar los problemas que encuentro, hago una elección W para mi sucursal.

 git cherry-pick -x W 

Entonces vuelvo a W commit en mi hilo.

border=0
 git revert W 

Después de eso puedo continuar con la corrección.

La última historia podría verse así:

 ---o---o---o---M---W---x-------x-------* / / ---A---B---W---W`----------C---D 

Cuando envío PR, se mostrará claramente que PR cancela devoluciones y agrega nuevos confirmaciones.

29
26 марта '13 в 23:21 2013-03-26 23:21 Maksim Kotlyar da la respuesta el 26 de marzo de 2013 a las 23:21 2013-03-26 23:21

Para devolver el revés, no hay que torcer demasiado el flujo de trabajo:

  • Crea una copia local de basura para el desarrollo.
  • Cancelar volver a comprometerse a la copia local del desarrollo
  • Vuelque esta copia en su rama de funciones y haga clic en su rama de funciones en su servidor git.

Ahora su rama de función debe combinarse como de costumbre cuando esté listo para ello. El único inconveniente aquí es que tendrá varias combinaciones / repeticiones adicionales en su historia.

2
22 мая '17 в 21:32 2017-05-22 21:32 Sam Dufel dio la respuesta el 22 de mayo de 2017 a las 21:32 2017-05-22 21:32

En lugar de usar git-revert puede usar este comando en la rama de devel para desechar (cancelar) una solución de fusión incorrecta (en lugar de simplemente devolverla).

 git checkout devel git reset --hard COMMIT_BEFORE_WRONG_MERGE 

También ajustará los contenidos del directorio de trabajo en consecuencia. Ten cuidado

  • Guarde los cambios en la rama de desarrollo (con una combinación incorrecta), ya que también se borrarán utilizando git-reset . Todas las confirmaciones después de especificar cómo desaparecerá el argumento de git reset !
  • Además, no haga esto si sus cambios ya se han extraído de otros repositorios porque el restablecimiento reescribirá el historial.

Recomiendo revisar cuidadosamente la página de manual de git-reset antes de intentar hacer esto.

Ahora, después de restablecer, puede volver a aplicar sus cambios a devel y luego hacer

 git checkout devel git merge 28s 

Esta será una verdadera fusión de 28s a devel , al igual que el original (que ahora se borra del historial de git).

2
05 июля '09 в 17:29 2009-07-05 17:29 respuesta dada knweiss 05 de julio de 2009 a las 17:29 2009-07-05 17:29

Acabo de encontrar esta publicación, frente al mismo problema. Me parece más alto que asustar para hacer restablecer hards, etc. Eventualmente eliminaré lo que no quiero y no puedo devolverlo.

En vez de eso, revisé el arreglo, quería que la rama regresara, por ejemplo. git checkout 123466t7632723 . Luego se convierte en una rama de git checkout my-new-branch . Luego borré una rama en la que ya no quería. Por supuesto, esto solo funcionará si puedes lanzar una rama que arruinaste.

1
13 нояб. La respuesta la da Nicola el 13 de noviembre. 2017-11-13 13:34 '17 a la 1:34 p.m. 2017-11-13 13:34

Otras preguntas sobre tags o Haz una pregunta