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úntmp
) con:- una nueva base
- una historia más limpia