commits git git-squash

git squash 2 commits



Git squash se compromete en medio de una rama. (1)

Quiero aplastar varias confirmaciones juntas en 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

Donde H es equivalente a B -- C -- D Y quiero poder especificar el mensaje de confirmación de H A es la última confirmación que se ha enviado, por lo que todas las confirmaciones posteriores pueden reescribirse sin desordenar el servidor. La idea es limpiar la historia antes de que avance rápidamente.

Cómo puedo hacer eso ?

PD: Tenga en cuenta que en mi caso en realidad tengo más de 3 compromisos 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 donde E , F y G permanezcan intactos (principalmente con respecto a la fecha de compromiso).


Puede hacer una rebase interactiva y seleccionar manualmente las confirmaciones que desea aplastar. Esto volverá a escribir el historial de su rama de desarrollo, pero como no ha presionado estos compromisos, no debería haber ninguna consecuencia negativa de esto, además de lo que podría ocurrir en su propia computadora.

Comience con lo siguiente:

git checkout dev git rebase -i HEAD~6

Esto debería abrir una ventana que le muestra la siguiente lista de 7 confirmaciones, retrocediendo 6 pasos desde la CABEZA de su rama de desarrollo:

pick 07c5abd message for commit A pick dl398cn message for commit B pick 93nmcdu message for commit C pick lst28e4 message for commit D pick 398nmol message for commit E pick 9kml38d message for commit F pick 02jmdmp message for commit G

La primera confirmación mostrada ( A arriba) es la más antigua y la última es la más reciente. Puede ver que, de forma predeterminada, la opción para cada confirmación es la pick . Si terminaste la rebase ahora, solo estarías reteniendo cada compromiso tal como es, lo que es efectivamente un no-op. Pero como desea aplastar ciertos compromisos intermedios, edite y cambie la lista a esto:

pick 07c5abd message for commit A pick dl398cn new commit message for "H" goes here squash 93nmcdu message for commit C squash lst28e4 message for commit D pick 398nmol message for commit E pick 9kml38d message for commit F pick 02jmdmp message for commit G

Note cuidadosamente lo que está pasando arriba. Al escribir squash le estás diciendo a Git que fusione ese commit en el que está arriba , que es el commit que vino inmediatamente antes . Así que esto dice que aplastar D cometa al revés en cometer C , y luego aplastar C en B , dejándole con un solo cometer para cometer B , C y D Las otras confirmaciones permanecen como están.

Guarde el archivo ( : wq en Git Bash en Windows), y el rebase está completo. Tenga en cuenta que puede obtener conflictos de combinación de esto como podría esperar, pero no hay nada especial en resolverlos y puede continuar como lo haría con cualquier rebase o combinación regular.

Si inspecciona la sucursal después de la rebase, observará que las confirmaciones E , F y G ahora tienen nuevos hashes, fechas, etc. Esto se debe a que estas confirmaciones se han reemplazado por confirmaciones nuevas. La razón de esto es que reescribió la historia y, por lo tanto, las confirmaciones en general ya no pueden ser las mismas que antes.