Tome el siguiente caso:
Tengo algo de trabajo en una rama temática y ahora estoy listo para volver a fusionarme con master:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Realizo la fusión de master, 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 noto 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 intento 'git rebase origin / master' desde master, me veo obligado a resolver todos los conflictos nuevamente, y también pierdo el commit de fusión:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
¿Hay una manera limpia de volver a crear la confirmación de fusión para que termine 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
git
merge
rebase
git-rebase
git-rewrite-history
jipumarino
fuente
fuente
git rebase --preserve-merges origin/master
git config --global pull.rebase preserve
para preservar siempre los compromisos de fusión durante un rebasegit --rebase-merges
finalmente reemplazará al antiguogit --preserve-merges
. Vea ¿Qué hace exactamente "rebase --preserve-merges
" Git (y por qué?)--preserve-merges
es obsoleto. Usogit rebase --rebase-merges origin/master
Respuestas:
Aquí hay dos opciones.
Una de ellas es hacer un rebase interactivo y editar el commit de fusión, rehacer la fusión manualmente y continuar el rebase.
Otra es usar la
--rebase-merges
opción ongit rebase
, que se describe de la siguiente manera en el manual: "Por defecto, un rebase simplemente eliminará los commits de fusión de la lista de tareas y colocará los commits rebaseados en una única rama lineal. Con --rebase- fusiones, la modificación intentará preservar la estructura de ramificación dentro de las confirmaciones que se van a modificar, recreando las confirmaciones de fusión. Cualquier conflicto de fusión resuelto o enmiendas manuales en estas confirmaciones de fusión tendrá que resolverse / volver a aplicarse manualmente ".fuente
Ok, esa es una vieja pregunta y ya ha aceptado la respuesta
@siride
, pero esa respuesta no fue suficiente en mi caso, ya--preserve-merges
que te obliga a resolver todos los conflictos por segunda vez. Mi solución basada en la idea@Tobi B
pero con comandos exactos paso a pasoEntonces, comenzaremos con ese estado según el ejemplo de la pregunta:
Tenga en cuenta que tenemos 2 commits más adelante, por lo que cherry-pick no funcionaría.
En primer lugar, creemos el historial correcto que queremos:
Usamos
--preserve-merges
para guardar nuestra confirmación de fusión en la historia. Solíamos--strategy=ours
ignorar todos los conflictos de fusión, ya que no nos importa qué contenido habrá en ese compromiso de fusión, solo necesitamos un buen historial ahora.La historia se verá así (ignorando al maestro):
Vamos a obtener el índice correcto ahora.
Podemos obtener algunos conflictos de fusión adicionales aquí, pero eso solo serían conflictos de archivos cambiados entre
8101fe3
yf5a7ca8
, pero no incluye conflictos ya resueltos detopic
El historial se verá así (ignorando el historial correcto):
La última etapa es combinar nuestra rama con el historial correcto y la rama con el índice correcto
Usamos
reset --soft
para restablecer nuestra rama (e historial) para corregir el historial, pero dejamos el índice y el árbol de trabajo como está. Luego, usamoscommit --amend
para reescribir nuestra confirmación de fusión, que solía tener un índice incorrecto, con nuestro buen índice del maestro.Al final tendremos dicho estado (tenga en cuenta otra identificación de top commit):
fuente
git commit --amend
agrega los cambios a la última confirmación (HEAD, en este caso la confirmación de fusión). Debido a que el contenido de confirmación cambia, el hash se actualiza.Dado que acabo de perder un día tratando de resolver esto y de hecho encontré una solución con la ayuda de un compañero de trabajo, pensé que debía intervenir.
Tenemos una base de código grande y tenemos que lidiar con 2 ramas que se modifican fuertemente al mismo tiempo. Hay una rama principal y una rama secundaria si usted.
Mientras fusiono la rama secundaria en la rama principal, el trabajo continúa en la rama principal y para cuando termino, no puedo impulsar mis cambios porque son incompatibles.
Por lo tanto, necesito "rebase" mi "fusión".
Así es como finalmente lo hicimos:
1) tome nota de la SHA. Ej .: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
2) Crea el historial apropiado pero esto romperá la fusión.
3) tome nota de la SHA. ej .: 29dd8101d78
4) Ahora restablece a donde estabas antes
5) Ahora combine el maestro actual en su rama de trabajo
6) Ahora que tiene los archivos correctos, pero el historial incorrecto, obtenga el historial correcto además de su cambio con:
7) Y luego: modifique los resultados en su confirmación de fusión original
Voila!
fuente
Parece que lo que quieres hacer es eliminar tu primera fusión. Puede seguir el siguiente procedimiento:
Eso te daría lo que quieres.
fuente
fuente