Soy nuevo en git y estoy tratando de entender la diferencia entre un squash y un rebase. Según tengo entendido, realizas un squash cuando haces un rebase.
Ambos git merge --squash
y git rebase --interactive
pueden producir un compromiso "aplastado".
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 una confirmación de inmediato: necesita una adicional git commit -m "squash branch"
)
Esto es útil si desea descartar por completo la rama de origen, pasando 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 eliminando la tmp
rama.
Nota: git merge
tiene una --commit
opción , pero no se puede usar con --squash
. Fue nunca se pueden utilizar --commit
y --squash
juntos.
Desde Git 2.22.1 (Q3 2019), esta incompatibilidad se hace explícita:
Ver commit 1d14d0c (24 de mayo de 2019) por Vishal Verma ( reloadbrain
) .
(Fusionada por Junio C Hamano - gitster
- en commit 33f2790 , 25 jul 2019)
merge
: rechazar--commit
con--squash
Anteriormente, cuando
--squash
se suministraba 'option_commit
', se soltó en silencio. Esto podría haber sido sorprendente para un usuario que intentó anular el comportamiento sin 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."));
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 elige aplastar todas las confirmaciones de tmp
(pero, al contrario merge --squash
, puede elegir reproducir algunas y aplastar otras).
Entonces las diferencias son:
squash
no toca tu rama de origen ( tmp
aquí) y crea una única confirmación donde quieras.rebase
le permite continuar en la misma rama fuente (aún tmp
) con:
G
esc--d--e--f--g
aplastado juntos?tmp
commits aplastados juntos.G
no representará el mismo contenido queg
, debido a los cambios introducidos porX
.git merge --no-ff temp
lugar degit merge --squash temp
, obtienes un historial desordenado, pero también puedes hacer cosas comogit revert e
, mucho más fácilmente. Es una historia desordenada, pero honesta y pragmática, y la rama principal sigue siendo bastante limpia.git bisect
ogit blame
cuando se utiliza con demasiada frecuencia (como engit pull --no-ff
: stackoverflow.com/questions/12798767/... ). De todos modos, no hay un enfoque, por eso este artículo describe tres ( stackoverflow.com/questions/9107861/… )Fusionar confirmaciones: retiene todas las confirmaciones en su rama y las intercala con confirmaciones en la rama base
Combinar Squash: retiene 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 todos los nuevos commits en master
Más aquí
fuente
Combinar squash combina un árbol (una secuencia de confirmaciones) en una única confirmación. Es decir, aplasta todos los cambios realizados en n commits en un solo commit.
Rebasar es volver a basar, es decir, elegir una nueva base (confirmación principal) para un árbol. Quizás el término mercurial para esto sea más claro: lo llaman trasplante porque es solo eso: elegir un nuevo terreno (compromiso de los padres, raíz) para un árbol.
Al hacer un rebase interactivo, se le da la opción de aplastar, elegir, editar u omitir los commits que va a rebase.
¡Espero que haya quedado claro!
fuente
Comencemos por el siguiente ejemplo:
Ahora tenemos 3 opciones para fusionar los cambios de la rama de características en la rama maestra :
Combinar confirmaciones
Mantendrá el historial de todas las confirmaciones de la rama característica y las moverá a la rama maestra.
Agregará una confirmación ficticia adicional.
Rebase y fusión Agregará
todo el historial de confirmaciones de la rama de características en el frente de la rama maestra
NO agregará una confirmación ficticia adicional.
Aplastar y fusionar
Agrupará todas las confirmaciones de la rama de características en una confirmación y luego la agregará al frente de la rama maestra.
Agregará una confirmación ficticia adicional.
A continuación puede encontrar cómo se verá la rama maestra después de cada una de ellas.
En todos los casos:
podemos ELIMINAR de manera segura la rama de características .
fuente