Au début de la course, l'équipe Lidl-Trek prend les choses en main afin de protéger le maillot vert Jonathan Milan et ne pas laisser une échappée sortir avant le sprint intermédiaire. C'est Milan lui-même qui passe en tête sur la ligne du sprint et marque 20 points supplémentaires. Plusieurs coureurs, comme Wout van Aert (Visma-Lease a Bike), attaquent et tentent leur chance mais cela ne donne rien. À 145 km de l'arrivée, un groupe de 40 coureurs prend quelques longueurs d’avance sur le peloton. Le Belge Tim Wellens (UAE Emirates XRG) sort du groupe des fuyards, il possède une dizaine de secondes sur ses poursuivants, van Aert, Lutsenko (Israel-Premier Tech), Groves (Alpecin-Deceuninck), et Rutsh (Intermarché-Wanty) qui le rejoignent. Ils sont quatre coureurs en tête avec une trentaine de secondes d'avance sur le premier groupe de poursuivants au pied du col du Glandon (21,7 km à 5,1 %). Dans l'ascension Groves lâche prise, van Aert se relève à son tour, ils ne sont alors plus que deux aux commandes de la course. Derrière, plusieurs coureurs sont partis en chasse : Primož Roglič (Red Bull-Bora-Hansgrohe), Felix Gall (Decathlon-AG2R La Mondiale), Matteo Jorgenson (Visma-Lease a Bike), Lenny Martinez (Bahrain Victorious) et Michael Woods (Israel-Premier Tech). Deux hommes, Michael Storer (Tudor) et Thymen Arensman (Ineos Grenadiers) sortent ensuite du peloton et rejoignent le groupe Roglič. À 122,8 km de l'arrivée, la jonction est faite avec les deux hommes de tête, ils sont désormais 14 coureurs à ouvrir la route. Le groupe maillot jaune est pointé à 1 min 12 s. Lenny Martinez passe en premier au sommet du col du Glandon devant Arensman.
Après avoir accéléré dans la descente, Arensman et Jorgenson se retrouvent seuls en tête. À 86 km du terme de l'étape, le porteur du maillot à pois, qui a été lâché dans la descente, accuse un retard de 2 min 18 s sur les deux hommes de tête. Sous l'impulsion de l'équipe Visma-Lease à Bike, le groupe maillot jaune explose. À 70 km de l'arrivée, l'échappée est rejointe par Pogačar (UAE Emirates XRG) et Vingegaard (Visma-Lease a Bike), tandis qu'en tête ils ne sont plus que 7 coureurs. Au sommet du col de la Madeleine (19,2 km à 7,9 %), c'est Vingegaard qui passe en tête.
Dans la vallée les attaques fusent. Felix Gall accélère puis un peu plus loin Florian Lipowitz (Red Bull-Bora-Hansgrohe) profite du marquage entre les deux favoris du Tour pour sortir du groupe maillot jaune qui est désorganisé. Dans la montée du col de la Loze (26,5 km à 6,5 %), deux hommes sont en tête : Einer Rubio (Movistar) et Ben O'Connor (Jayco AlUla), suivis à 34 s par Matteo Jorgenson et à 1 min 10 s par Florian Lipowitz. Le peloton est pointé à 3 min 30 s. Au cours de la montée, Arensman décroche du groupe maillot jaune. À 16 km de l'arrivée, O'Connor accélère, son compagnon d'échappée Einer Rubio ne parvient pas à le suivre. L'Australien part en solitaire et file vers la victoire. Derrière, Lipowitz est distancé, alors que Vingegaard attaque à 1 km de la ligne d'arrivée mais ne parvient pas à se défaire de Pogačar. O'Connor remporte l'étape reine de ce Tour, devant le maillot jaune qui arrive à 1 min 45 s, Vingegaard prend la troisième place avec 1 min 54 s de retard sur le vainqueur de l'étape.
Lenny Martinez (Bahrain-Victorious) a été sanctionné pour avoir utilisé la technique interdite du « bidon collé » dans l’ascension du col du Glandon. Il a écopé d’une pénalité de 8 points au classement du meilleur grimpeur, passant ainsi de 80 à 72 points, et rétrogradant à la 3e place derrière Tadej Pogačar et Jonas Vingegaard. En plus de cette sanction, le coureur français a reçu une amende de 200 francs suisses, une pénalité de 15 points au classement UCI, ainsi qu'une pénalité de 10 secondes au classement général[4].