strategy how drop commits all git merge rebase git-rebase git-rewrite-history

how - Reasignación de un compromiso de fusión Git



how to use rebase in git (5)

Aquí hay dos opciones.

Una es hacer una rebase interactiva y editar la confirmación de fusión, rehacer la fusión manualmente y continuar la rebase.

Otra es usar la opción -p en git rebase , que se describe como sigue en el manual: "En lugar de ignorar las fusiones, intente recrearlas". Esta pregunta lo explica aún más: ¿Qué hace exactamente "rebase - preserve-merges" de git (y por qué?)

Tome el siguiente caso:

Tengo algo de trabajo en una rama de temas y ahora estoy listo para fusionar de nuevo a maestro:

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

Realizo la fusión de maestro, resuelvo los conflictos y ahora tengo:

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

Ahora, la fusión me llevó algo de tiempo, así que hago otra búsqueda y veo que la rama maestra remota tiene nuevos cambios:

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

Si pruebo ''git rebase origin / master'' desde master, me veo forzado a resolver todos los conflictos nuevamente, y también pierdo la combinación de fusión:

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

¿Hay alguna manera clara de volver a establecer la base de la fusión, así que termino con un historial como el que muestro a continuación?

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


Dado que simplemente perdí un día tratando de resolver esto y realmente encontré una solución con la ayuda de un compañero de trabajo, pensé que debería intervenir.

Tenemos una gran base de código y tenemos que lidiar con 2 ramas que se modifican en gran medida al mismo tiempo. Hay una rama principal y una secundaria si tú.

Mientras fusiono la rama secundaria en la rama principal, el trabajo continúa en la rama principal y, cuando termino, no puedo modificar mis cambios porque son incompatibles.

Por lo tanto, necesito "volver a establecer la base" de mi "fusión".

Así es como finalmente lo hicimos:

1) anotar el SHA. Ej .: c4a924d458ea0629c0d694f1b9e9576a3ecf506b

git log -1

2) Crea el historial adecuado, pero esto romperá la fusión.

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

3) tomar nota del SHA. Ej .: 29dd8101d78

git log -1

4) Ahora reinicia a donde estabas antes

git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard

5) Ahora combine 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 el historial incorrecto, obtenga el historial correcto sobre su cambio con:

git reset 29dd8101d78 --soft

7) Y luego - enmienda los resultados en su compromiso original de fusión

git commit --amend

Voila!


Ok, esa es una vieja pregunta y ya ha aceptado la respuesta de @siride , pero esa respuesta no fue suficiente en mi caso, ya que --preserve-merges te obliga a resolver todos los conflictos por segunda vez. Mi solución basada en la idea de @Tobi B pero con comandos exactos paso a paso

Así que comenzaremos con dicho estado basándonos en el ejemplo de la pregunta:

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

Tenga en cuenta que tenemos 2 commits adelante master, por lo que cherry-pick no funcionaría.

  1. Antes que nada, creemos el historial correcto que queremos:

    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 nuestro commit de fusión en la historia -s ours --strategy=ours means- --strategy=ours , lo usamos para ignorar todos los conflictos de fusión ya que no nos importa qué contenido será en ese fusionar compromiso, solo necesitamos buena historia ahora.

    La historia se verá así (ignorando el maestro):

    * 51984c7 Merge branch ''topic'' [HEAD -> correct-history] |/ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1

  2. Vamos a obtener el índice correcto ahora.

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

    Es posible que tengamos algunos conflictos de fusión adicionales aquí, pero eso solo sería conflictos de archivos cambiados entre 8101fe3 y f5a7ca8 , pero no incluye 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

  3. La última etapa es combinar nuestra rama con la historia correcta y la rama con el índice correcto

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

    Usamos reset --soft para restablecer nuestra sucursal (y su historial) para corregir el historial, pero dejamos el índice y el árbol de trabajo tal como están. Luego usamos commit --amend para reescribir nuestra commit de fusión, que solía tener índice incorrecto, con nuestro buen índice de master.

    Al final tendremos tal estado (note otra identificación de la confirmación superior):

    * 13e6d03 Merge branch ''topic'' [HEAD -> master] |/ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1


Parece que lo que quieres hacer es eliminar tu primera combinación. Puede seguir el siguiente procedimiento:

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

Eso te daría lo que quieres.


  • De tu fusión, cometer
  • Elige el nuevo cambio que debería ser fácil
  • copia tus cosas
  • rehaga la fusión y resuelva los conflictos simplemente copiando los archivos de su copia local;)