Saltar al contenido

En git, ¿cuál es la diferencia entre merge –squash y rebase?

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

Merge Squash: conserva los cambios pero omite las confirmaciones individuales del historial
ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

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!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *