git: ¿cómo limpiar una twig compleja antes de fusionarse con el maestro?

Normalmente git rebase -i master antes de fusionar una twig en master para squash o corregir commits pequeños (por ejemplo, el post de confirmación es solo "refactor"), pero ¿qué puedo hacer con twigs más grandes y complejas que han combinado master y children? en varias etapas? Creo que Rebase funciona para este escenario simple (basado en googlear):

  * (newest commit) |\ * | | * grandchild * | |/ * child | / | * master (oldest commit) 

Pero, ¿y este?

  * (newest commits) |\ * | /| * grandchild * * | | |/ | * child * | |/ | * master (oldest commit) 

¿Hay alguna manera de simplificar esta historia sin una gran cantidad de esfuerzo? Intenté con git rebase -i master y hay muchos conflictos (algunos de los cuales están en blanco gracias a la rerere , supongo, pero algunos son difíciles de resolver). Para ser claro, este es mi resultado deseado (claramente podemos ejecutar una combinación catch-up en master y tendremos un historial lineal, el número final de commits en la twig hijo es arbitrario):

  * (newest commit) | * child | / | * master (oldest commit, though newest in master) 

Mis disculpas si esta es una pregunta duplicada, como es probable (pero no puedo encontrar una que aborde mi problema específicamente).

Hay algunas opciones.

Primero, la rebase -i probablemente funcione. Vale la pena intentarlo, esto es git, por lo que puede volver a su estado anterior si es necesario. (Si está en la branch-X cuando inicia la rebase, y todo sale mal, usted sabe que (a) la rebase solo cambia la branch-X ref, y (b) la reflog se puede usar para moverla hacia atrás, asi que

 git reset --hard branch-X@{1} 

y no se hace daño.)

Ahora bien, si eso falla de alguna manera particular, o parece demasiado difícil de corregir, ese es un lugar de inicio más informado (y mejor IMO) para una pregunta.

Dicho eso, creo que para este caso particular podría ser más fácil de hacer

 git checkout child git merge --squash branch-X git commit git branch -f branch-X 

como una "fusión de squash" se trata de replace cualquier topología que esté involucrada en una fusión con una única confirmación.

Tenga en count que de cualquier manera, de hecho, de cualquier forma que haga esto, las mejores prácticas dirían que no lo haga si las confirmaciones que está reemplazando se han enviado a remoto. Esto generalmente se establece como una advertencia sobre el rebasamiento, pero se aplica a cualquier operación que modifique el historial.