Git fusionar retirada

Tomemos el siguiente caso:

Tengo algo de trabajo en el hilo del tema, y ​​ahora estoy listo para volver al maestro:

 * eb3b733 3 [master] [origin/master] | * b62cae6 2 [topic] |/ * 38abeae 1 

Me fusiono con el maestro, resuelvo conflictos y ahora tengo:

 * 8101fe3 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] * | eb3b733 3 [origin/master] |/ * 38abeae 1 

Ahora tomó un tiempo para la combinación, así que hago otra elección y me doy cuenta de que la rama del asistente remoto tiene nuevos cambios:

 * 8101fe3 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] | | * e7affba 4 [origin/master] | |/ |/| * | eb3b733 3 |/ * 38abeae 1 

Si pruebo el 'git rebase origin / master' desde el maestro, tengo que resolver todos los conflictos de nuevo y también perder la solución de fusión:

 * d4de423 2 [master] * e7affba 4 [origin/master] * eb3b733 3 | * b62cae6 2 [topic] |/ * 38abeae 1 

¿Hay una forma limpia de restablecer la corrección de fusión, de modo que obtengo una historia similar a la que se muestra a continuación?

 * 51984c7 Merge branch 'topic' [master] |\ | * b62cae6 2 [topic] * | e7affba 4 [origin/master] * | eb3b733 3 |/ * 38abeae 1 
134
24 янв. fijado por jipumarino 24 ene 2011-01-24 18:15 '11 a las 18:15 2011-01-24 18:15
@ 5 respuestas

Hay dos opciones aquí.

Una de ellas es hacer un reinicio interactivo y editar la corrección de fusión, volver a combinar manualmente y continuar la rebase.

Otro es usar la opción -p en git rebase , que se describe en la siguiente guía: "En lugar de ignorar las combinaciones, intente recrearlas". Esta pregunta explica con más detalle esto: ¿Qué hace exactamente (y por qué?)

97
24 янв. La respuesta es dada por Siride el 24 de enero. 2011-01-24 19:01 '11 a las 19:01 2011-01-24 19:01

Es bueno que la vieja pregunta y él ya haya aceptado la respuesta @siride , pero esta respuesta no fue suficiente en mi caso, ya que la fuerza obliga a resolver todos los conflictos por segunda vez. Mi solución se basa en la idea de @Tobi B , pero con comandos precisos paso a paso.

Entonces, comenzaremos con este estado en el ejemplo en cuestión:

 * 8101fe3 Merge branch 'topic' [HEAD -> master] |\ | * b62cae6 2 [topic] | | | | * f5a7ca8 5 [origin/master] | | * e7affba 4 | |/ |/| * | eb3b733 3 |/ * 38abeae 1 
border=0

Tenga en cuenta que tenemos 2 fijaciones en frente del maestro, por lo que la empuñadura no funcionará.

  • En primer lugar, crea la historia que necesitamos:

     git checkout -b correct-history # create new branch to save master for future git rebase -s ours -p origin/master 

    -p significa --preserve-merges , lo usamos para guardar una fijación de fusión en la historia. -s ours significa --strategy=ours , lo usamos para ignorar todos los conflictos de fusión, porque no nos importa lo que el contenido será en esta unión, solo se necesita una buena historia

    La historia se verá así (ignorando al asistente):

     * 51984c7 Merge branch 'topic' [HEAD -> correct-history] |\ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1 
  • Ahora da el índice correcto.

     git checkout master # return to our master branch git merge origin/master # merge origin/master on top of our master 

    Puede haber conflictos de combinación adicionales, pero solo serán conflictos de archivos modificados entre 8101fe3 y f5a7ca8 , pero sin incluir los conflictos ya resueltos del topic

    La historia se verá así (ignorando la historia correcta):

     * 94f1484 Merge branch 'origin/master' [HEAD -> master] |\ * | f5a7ca8 5 [origin/master] * | e7affba 4 | * 8101fe3 Merge branch 'topic' | |\ | | * b62cae6 2 [topic] |/ / * / eb3b733 3 |/ * 38abeae 1 
  • La etapa final es combinar nuestra rama con el historial correcto y la rama con el índice correcto.

     git reset --soft correct-history git commit --amend 

    Usamos reset --soft para restablecer nuestra rama (y nuestro historial) para corregir el historial, pero dejamos el índice y el árbol de trabajo como están. Luego usamos commit --amend para sobrescribir nuestra fusión, que tenía el índice incorrecto, con nuestro buen índice maestro.

    Al final tendremos este estado (note la otra ID de corrección superior):

     * 13e6d03 Merge branch 'topic' [HEAD -> master] |\ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1 
12
14 дек. Respuesta dada por Ivan Naydonov 14 de diciembre. 2017-12-14 20:13 '17 a las 8:13 PM 2017-12-14 20:13

Teniendo en cuenta que perdí un día intentando resolverlo y en realidad encontré una solución con la ayuda de un colega, pensé que debía volver a llamar.

Tenemos una base de código grande, y tenemos que lidiar con 2 sucursales, que al mismo tiempo cambian. Hay una rama principal y una rama secundaria, si tú que.

Mientras fusiono la rama secundaria con la rama principal, el trabajo continúa en la rama principal y, en el momento de la finalización, no puedo impulsar mis cambios porque son incompatibles.

Por lo tanto, necesito "reinstalar" mi "combinación".

Así que finalmente lo hicimos:

1) prestar atención a SHA. Ejemplo: c4a924d458ea0629c0d694f1b9e9576a3ecf506b

 git log -1 

2) Crea la historia correcta, pero romperá la fusión.

 git rebase -s ours --preserve-merges origin/master 

3) prestar atención a SHA. Ejemplo: 29dd8101d78

 git log -1 

4) Ahora reinicia donde estabas antes

 git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard 

5) Ahora fusione el maestro actual en su rama de trabajo.

 git merge origin/master git mergetool git commit -m"correct files 

6) Ahora que tiene los archivos correctos, pero la historia incorrecta, obtenga la historia correcta al inicio de su cambio con:

 git reset 29dd8101d78 --soft 

7) Y luego cancelar los resultados en el commit original.

 git commit --amend 

Voila!

3
14 дек. Claude Peloquin respondió el 14 de diciembre. 2017-12-14 19:47 '17 a las 7:47 pm 2017-12-14 19:47

Parece que quieres eliminar tu primera combinación. Puede realizar el siguiente procedimiento:

 git checkout master # Let make sure we are on master branch git reset --hard master~ # Let get back to master before the merge git pull # or git merge remote/master git merge topic 

Esto te dará lo que quieras.

1
24 янв. La respuesta la da Antoine Pelisse el 24 de enero. 2011-01-24 21:10 '11 a las 21:10 2011-01-24 21:10
  • De su fijación de fusión
  • Cereza: seleccione un nuevo cambio que debería ser fácil.
  • Copia tus materiales.
  • fusionar y resolver conflictos simplemente copiando archivos de su copia local;)
0
30 нояб. La respuesta es dada a Tobi B el 30 de noviembre. 2017-11-30 19:26 '17 a las 7:26 pm 2017-11-30 19:26