what tutorial ejemplo does git merge rebase git-rebase squash

tutorial - git squash



En git, ¿cuál es la diferencia entre fusionar--squash y rebase? (3)

Soy nuevo en git y estoy tratando de entender la diferencia entre un squash y una rebase. Como lo entiendo, realizas un squash cuando haces una rebase.


Fusionar confirmaciones: retiene todas las confirmaciones en su rama y las intercala con las confirmaciones en la base.

Fusionar Squash: conserva los cambios pero omite las confirmaciones individuales del historial

Rebase: Esto mueve toda la rama de características para comenzar en la punta de la rama maestra, incorporando efectivamente todas las nuevas confirmaciones en la maestra

Más here


Fusionar squash fusiona un árbol (una secuencia de confirmaciones) en una única confirmación. Es decir, aplasta todos los cambios realizados en n confirmaciones en una única confirmación.

Rebasar es volver a basar, es decir, elegir una nueva base (confirmación principal) para un árbol. Tal vez el término mercurial para esto sea más claro: lo llaman trasplante porque es solo eso: escoger un nuevo terreno (compromiso principal, raíz) para un árbol.

Al hacer una rebase interactiva, se le da la opción de aplastar, seleccionar, editar o omitir los compromisos que se van a rebautizar.

Espero que haya quedado claro!


Tanto git merge --squash como git rebase --interactive pueden producir una confirmación "aplastada".
Pero sirven para diferentes propósitos.

producirá una confirmación aplastada en la rama de destino, sin marcar ninguna relación de fusión.
(Nota: no produce un commit de inmediato: necesita un git commit -m "squash branch" adicional)
Esto es útil si desea deshacerse completamente de la rama fuente, a partir de (esquema tomado de la pregunta SO ):

git checkout stable X stable / a---b---c---d---e---f---g tmp

a:

git merge --squash tmp git commit -m "squash tmp" X-------------------G stable / a---b---c---d---e---f---g tmp

y luego borrando la rama tmp .

vuelve a reproducir algunos o todos sus compromisos en una nueva base, lo que le permite aplastar (o más recientemente "arreglar", vea esta pregunta SO ), yendo directamente a:

git checkout tmp git rebase -i stable stable X-------------------G tmp / a---b

Si elige aplastar todas las confirmaciones de tmp (pero, al contrario de merge --squash , puede elegir reproducir algunas y aplastar otras).

Así que las diferencias son:

  • merge no toca su rama de origen ( tmp aquí) y crea un solo compromiso donde desee.
  • rebase permite continuar en la misma rama fuente (aún tmp ) con:
    • una nueva base
    • una historia más limpia