L'étape de 191 kilomètres part de Le Teil en Ardèche, se dirige au sud-ouest vers Alès (km 88), Anduze (km 104,5), puis Saint-Hippolyte-du-Fort (km 125,5) où a lieu le sprint intermédiaire, Ganges (km 138) et l'arrivée inédite se fait au sommet du Mont Aigoual situé dans le Gard qui culmine à 1 560 m d'altitude. Les 140 premiers kilomètres sont sans difficulté, avant le Cap de Coste (2,1 km à 7,3 %, 3e catégorie) depuis Sumène et l'enchaînement final col des Mourèzes (6,1 km à 4,8 %, 3e catégorie), col de la Lusette (11,7 km à 7,3 %, 1re catégorie et bonifications) et le Mont Aigoual (8,3 km à 4 %, non répertorié). Bien que le Tour de France 1987 soit déjà passé par l'Observatoire, il s'agit ici d'une arrivée inédite au point culminant du Gard.
Dès le km 0, les baroudeurs tentent de s'extraire du peloton. Au km 8, l'échappée est formée, on retrouve ainsi huit coureurs à l'avant : l'américain Neislon Powless (EF Pro Cycling), le belge Greg Van Avermaet (CCC Team), l'espagnol Jesus Herrada (Cofidis), le français champion de France du contre-la-montre 2020 Rémi Cavagna (Deceuninck-Quick-Step), l'irlandais Nicolas Roche (Sunweb), l'italien Daniel Oss (Bora-Hansgrohe), le champion du Kazakhstan Alexey Lutsenko (Astana) et le norvégien Edvald Boasson Hagen (NTT). Au sprint intermédiaire de Saint-Hippolyte-du-Fort (km 125,5), Edvald Boasson Hagen passe en tête devant Daniel Oss et Greg Van Avermaet. L'allemand Roger Kluge (Lotto-Soudal) part seul à l'avant du peloton pour récupérer des points au sprint intermédiaire, tandis que Sam Bennett (Deceuninck-Quick-Step) conclue le sprint du groupe maillot jaune. Au km 146, Nicolas Roche devance Greg Van Avermaet au sommet du Cap de Coste (2,1 km à 7,3%, 3ème catégorie). En tête de peloton, l'équipe Mitchelton-Scott du maillot jaune anglais Adam Yates prend ses responsabilités au moment où le gruppetto se détache à l'arrière.
A Le Vigan, au pied de l’enchaînement menant les coureurs au Mont Aigoual, l'échappée possède un écart de 3 min 40 sec sur le peloton, désormais mené par les Ineos-Grenadiers. Le col des Mourèzes (6,1 km à 4,8%, 3e catégorie), figurant comme le pied de l'enchaînement final, est franchi par Nicolas Roche puis Jesus Herrada. Le gros morceau de ce final est le col de la Lusette (11,7 km à 7,3%). Ce col, réputé dans la région pour sa dureté et sa route étroite et cabossée, n'avait jamais été emprunté par le Tour de France. A 20 km de l'arrivée, l'italien Fabio Aru (UAE Emirates) se lance à l'avant mais est récupéré avant le sommet avec quelques coureurs qui avaient formé l'échappée. Tandis qu'Alexey Lutsenko s'envole à l'avant sur les pourcentages les plus difficiles. A l'arrière du peloton sont distancés Sergio Higuita, Miguel Angel Lopez ou encore Enric Mas. Lutsenko passe en tête au sommet avec une avance de 30 sec sur Herrada et de plus de 3 min sur le groupe maillot jaune, les trois premiers reçoivent des bonifications. Ce final se termine par un long faux-plat montant en direction de l'Observatoire (8,3 km à 4%, non répertorié), où le champion kazakh ne cesse de creuser son écart. Alexey Lutsenko l'emporte avec 55 sec d'avance sur l'espagnol Jesus Herrada. Derrière, Greg Van Avermaet et Neilson Powless terminent, respectivement à la 3ème et 4ème place de l'étape à 2 min 15 sec et 2 min 17 sec du vainqueur. Julian Alaphilippe tente de prendre à revers le sprint du peloton en plaçant une attaque à 500 m de la ligne, prenant 1 sec sur le maillot jaune et les favoris à la victoire finale.
Au niveau des classements, Adam Yates garde son maillot jaune pour 3 sec sur Primoz Roglic et 7 sec sur Tadej Pogacar. Le maillot vert reste sur les épaules de Sam Bennett, comme le blanc à pois rouges sur celles de Benoît Cosnefroy. Le slovène Tadej Pogacar, 3ème au classement général, porte le maillot blanc du meilleur jeune à 6 sec du colombien Egan Bernal, vainqueur du dernier Tour. EF Pro Cycling est en tête du classement par équipe.