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.

¿Fue útil?

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ún tmp) 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 introducir descripción de la imagen aquí

Combinar Squash: conserva los cambios, pero omite el individuo se compromete de la historia introducir descripción de la imagen aquí

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

 introducir descripción de la imagen aquí

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top