Le départ réel est retardé en raison d'un problème mécanique du Néerlandais Dylan Groenewegen (BikeExchange Jayco) et d'un problème de chaussures pour le Français Benjamin Thomas (Cofidis). Prévu à Saint-Jean-d'Aulps, il est finalement donné au pied du Biot.
Au sommet de la côte de Chevenoz (2,2 km à 2,9 %, 4e catégorie), le Français Pierre Latour (TotalEnergies) précède le peloton. Plusieurs coureurs tentent de prendre l'échappée, mais ils sont repris à chaque fois. Seul le Français Alexis Gougeard (B&B Hotels-KTM) parvient à prendre un avantage de plus de trente secondes sur le peloton, mais il est rattrapé peu après Thonon-les-Bains.
Au pied du col de Jambaz (6,7 km à 3,8 %, 4e catégorie), une échappée fleuve se constitue avec vingt-six coureurs :
Lennard Kämna (Bora-Hansgrohe),
Georg Zimmermann (Intermarché-Wanty-Gobert Matériaux),
Matteo Jorgenson et Andreas Leknessund (DSM),
Quinn Simmons et Mads Pedersen (Trek-Segafredo),
Simon Clarke (Israel-Premier Tech),
Nick Schultz et Jack Bauer (BikeExchange Jayco), Philippe Gilbert (Lotto-Soudal),
Guillaume Van Keirsbulck et Kristian Sbaragli (Alpecin-Deceuninck),
Connor Swift et Hugo Hofstetter (Arkéa-Samsic), Fred Wright et Luis León Sánchez (Bahrain Victorious), Magnus Cort Nielsen et Alberto Bettiol (EF Education-EasyPost), Ion Izagirre et Benjamin Thomas (Cofidis), Christophe Laporte (Jumbo-Visma), Pierre Rolland (B&B Hotels-KTM), Filippo Ganna et Dylan Van Baarle (Ineos Grenadiers), Simone Velasco (Astana Qazaqstan) et Edvald Boasson Hagen (TotalEnergies).
Au sommet, Rolland passe en tête devant Kämna, avec plus de trois minutes d'avance sur le peloton. Au sommet de la côte de Châtillon-sur-Cluses (4,5 km à 3,9 %, 4e catégorie), Rolland récidive ; le peloton compte un débours de six minutes et trente secondes. Dans la vallée de l'Arve, Alberto Bettiol part en solitaire.
Sur la route de Sallanches, des manifestants pour le climat bloquent la route, l'étape est neutralisée pendant douze minutes. Les coureurs repartent avec les mêmes écarts qui précédaient l'évènement. Faisant en sorte de ne pas se refroidir, Bettiol parvient à doubler la mise sur l'échappée qui repart à froid, passant d'un écart d'une vingtaine à une quarantaine de secondes. Au sprint intermédiaire de Passy-Marlioz (km 123,8), Alberto Bettiol passe en tête avec vingt-cinq secondes d'avance sur l'échappée, dans lequel Christophe Laporte récupère les points au classement du maillot vert, et neuf minutes et trente secondes sur le peloton.
Dans la montée finale vers l'altiport de Megève (19,2 km à 4,1 %, 2e catégorie), l'écart entre Bettiol et le reste de l'échappée stagne aux alentours des trente secondes. Placé à huit minutes et quarante-trois secondes au classement général, Lennard Kämna est virtuellement maillot jaune. Le coureur italien de EF Education-EasyPost est repris puis distancé à sept kilomètres de la ligne d'arrivée. Luis León Sánchez s'isole à l'avant, il passe au sommet et est repris dans la foulée. Alors, c'est un groupe d'une dizaine de coureurs qui entrent dans l'altiport pour se disputer la victoire d'étape. Benjamin Thomas lance le sprint, Nick Schultz et Magnus Cort Nielsen s'affirment comme les deux coureurs les plus puissants. La victoire d'étape se décide à la photo-finish ; entre les deux coureurs, c'est le Danois, porteur du maillot à pois en première semaine du Tour, qui s'impose sur les hauteurs de Megève.
Au niveau des différents classements, le Slovène Tadej Pogačar (UAE Emirates) conserve les maillots blanc et jaune (finalement, Kämna termine deuxième du classement général, à onze secondes). Le Belge Wout van Aert (Jumbo-Visma) garde le maillot vert et l'Allemand Simon Geschke (Cofidis) le maillot à pois. L'équipe Ineos Grenadiers reste à la première place du classement par équipes.