Git Squash se compromete en medio de una rama

Quiero aplastar varias confirmaciones juntas en el medio de una rama sin modificar las confirmaciones antes y después.

Yo tengo :

A -- B -- C -- D -- E -- F -- G
|                             |
master                        dev
origin/master

Quiero aplastar eso en

A -- H -- E -- F -- G
|                   |
master              dev
origin/master

DóndeH es equivalente aB -- C -- D. Y quiero poder especificar el mensaje de confirmación deH. A es la última confirmación que se ha enviado, por lo que todas las confirmaciones posteriores pueden reescribirse sin alterar el servidor. La idea es limpiar el historial antes de avanzar rápidamentemaster.

Cómo puedo hacer eso ?

PD: Tenga en cuenta que en mi caso tengo más de 3 commits para aplastar en el medio, pero si puedo hacerlo con 3, debería poder hacerlo con más.

PPS: Además, si es posible, preferiría una solución dondeE, F yG permanecen intactos (principalmente con respecto a la fecha de confirmación).