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.
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íatmp
) con:- una nueva base
- una historia más limpia
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!
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
Merge Squash: retiene los cambios pero omite las confirmaciones individuales del historial
Rebase: Esto mueve toda la rama feature para comenzar en la punta de la rama master, incorporando efectivamente todas las nuevas confirmaciones en master
Más sobre aquí
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