Solución:
Ambos git merge --squash
y git rebase --interactive
puede producir una confirmación “aplastada”.
Pero sirven para diferentes propósitos.
git merge --squash abranch
producirá una confirmación aplastada en la rama de destino, sin marcar ninguna relación de fusión.
(Nota: no produce una confirmación de inmediato: necesita una git commit -m "squash branch"
)
Esto es útil si desea desechar la rama de origen por completo, desde (esquema tomado de la pregunta SO):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
para:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
y luego borrando tmp
rama.
Nota: git merge
tiene un --commit
opción, pero no se puede utilizar con --squash
. Era Nunca posible de usar --commit
y --squash
juntos.
Desde Git 2.22.1 (Q3 2019), esta incompatibilidad se hace explícita:
Consulte la confirmación 1d14d0c (24 de mayo de 2019) de Vishal Verma (reloadbrain
).
(Fusionada por Junio C Hamano – gitster
– en el compromiso 33f2790, 25 de julio de 2019)
merge
: rehusar--commit
con--squash
Anteriormente, cuando
--squash
fue suministrado, ‘option_commit
‘se dejó caer silenciosamente. Esto podría haber sido sorprendente para un usuario que intentó anular el comportamiento de no compromiso de squash usando--commit
explícitamente.
git/git
builtin/merge.c#cmd_merge()
ahora incluye:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
git rebase --interactive
reproduce algunas o todas sus confirmaciones 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 eliges aplastar todas las confirmaciones de tmp
(pero, contrario a merge --squash
, puedes optar por reproducir algunas y aplastar otras).
Entonces las diferencias son:
-
squash
no toca su rama fuente (tmp
aquí) y crea una única confirmación donde desee. -
rebase
Te permite continuar en la misma rama de origen (todavíatmp
) con:- una nueva base
- una historia más limpia
Fusionar confirmaciones: conserva todas las confirmaciones en su rama y las intercala con confirmaciones en la rama base
Merge 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 de manera efectiva todas las nuevas confirmaciones en la maestra.
Más aquí
Merge squash fusiona un árbol (una secuencia de confirmaciones) en una única confirmación. Eso es calabazas todos los cambios realizados en norte se compromete en una única confirmación.
Rebasar es volver a basar, es decir, elegir una nueva base (compromiso principal) para un árbol. Tal vez el término mercurial para esto sea más claro: lo llaman trasplante porque es solo eso: elegir 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 u omitir las confirmaciones que va a rebasar.
¡Espero que haya quedado claro!