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


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.

Author: GiH, 2010-03-11

3 answers

Tanto git merge --squash como git rebase --interactive pueden producir una confirmación "aplastada".
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 un commit de inmediato: necesita un git commit -m "squash branch" adicional)
Esto es útil si desea desechar la rama de origen por completo, pasando de (esquema tomado de ASÍ 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 eliminar tmp rama.

Repite algunos o todos tus commits en una nueva base, lo que te permite aplastar (o más recientemente "arreglar", ver 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, al contrario de merge --squash, puedes elegir repetir algunas y aplastar otras).

Así que las diferencias son:

  • merge no toca tu rama de origen (tmp aquí) y crea un solo commit donde quieras.
  • rebase le permite continuar en la misma rama fuente (todavía tmp) con:
    • una nueva base
    • una historia más limpia
 291
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:15

Merge squash fusiona 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.

Rebasing es volver a basar, es decir, elegir una nueva base (confirmación padre) para un árbol. Tal vez el término mercurial para esto es más claro: lo llaman trasplante porque es solo eso: elegir un nuevo terreno (compromiso de padre, raíz) para un árbol.

Al hacer un rebase interactivo, se le da la opción de: squash, elige, edita u omite las confirmaciones que vas a rebase.

¡Espero que haya quedado claro!

 69
Author: Mauricio Scheffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-11 18:15:41

Merge commits: retiene todos los commits en tu rama y los intercala con commits en la rama base introduzca la descripción de la imagen aquí

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

Rebase: Esto mueve toda la rama feature para comenzar en la punta de la rama master, incorporando efectivamente todas las nuevas confirmaciones en master

introduzca la descripción de la imagen aquí

Más sobre aquí

 64
Author: Md Ayub Ali Sarker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-31 13:34:59