En git, ¿cuál es la diferencia entre fusionar --squash y rebase?
-
19-09-2019 - |
Pregunta
Soy nuevo en git y estoy tratando de entender la diferencia entre squash y rebase.Según tengo entendido, realizas un squash cuando haces una rebase.
Solución
Ambos git merge --squash
y git rebase --interactive
puede producir un compromiso "aplastado".
Pero tienen propósitos diferentes.
producirá un compromiso aplastado en la rama de destino, sin marcar ninguna relación de fusión.
(Nota:no produce un compromiso de inmediato:necesitas un adicional git commit -m "squash branch"
)
Esto es útil si desea descartar la rama fuente por completo, desde (esquema tomado de Entonces pregunta):
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 tmp
rama.
Nota: git merge
tiene un --commit
opción, pero desde Git 2.22.1 (tercer trimestre de 2019), no puedes usarlo con git merge --squash
.
Ver cometer 1d14d0c (24 de mayo de 2019) por vishal verma (reloadbrain
).
(Fusionado por Junio C Hamano. gitster
-- en cometer 33f2790, 25 de julio de 2019)
merge
:rechazar--commit
con--squash
Anteriormente, cuando
--squash
fue suministrado, 'option_commit
'Fue caído en silencio.Esto podría haber sido sorprendente para un usuario que intentó anular el comportamiento no comprometido de la calabaza utilizando--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 tus confirmaciones en una nueva base, permitiéndote aplastar (o más recientemente "arreglar", mira esto Entonces pregunta), 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, al contrario de merge --squash
, puedes optar por reproducir algunos y aplastar otros).
Entonces las diferencias son:
merge
no toca su rama fuente (tmp
aquí) y crea una única confirmación donde quieras.rebase
Te permite continuar en la misma rama fuente (aúntmp
) con:- una nueva base
- una historia más limpia
Otros consejos
Combinar compromete: conserva todas las confirmaciones en su rama y los intercala con commits en la rama de base
Combinar Squash: conserva los cambios, pero omite el individuo se compromete de la historia
Rebase: Esto mueve toda la rama de la característica para comenzar en la punta de la rama principal, la incorporación efectiva de todas las nuevas confirmaciones en master
Más información sobre aquí
Combinar calabaza combina un árbol (una secuencia de confirmaciones) en un solo cometió. Es decir, calabazas todos los cambios realizados en n se compromete en una única confirmación.
El reajuste se cambio de base, es decir, la elección de una nueva base (matriz commit) para un árbol. Tal vez el término mercurial de esto es más claro: lo llaman trasplante porque es precisamente eso:. Recogiendo una nueva planta (padre cometió, raíz) para un árbol
Al hacer un rebase interactivo, se le ofrece la opción de squash, recoger, editar o saltarse las confirmaciones que se van a rebasar.
La esperanza de que estaba claro!