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 %, 3e 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 s 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 Jesús 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 Ángel López ou encore Enric Mas. Lutsenko passe en tête au sommet avec une avance de 30 s 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 s d'avance sur l'Espagnol Jesús Herrada. Derrière, Greg Van Avermaet et Neilson Powless terminent, respectivement à la 3e et 4e place de l'étape à 2 min 15 s et 2 min 17 s du vainqueur. Julian Alaphilippe tente de prendre à revers le sprint du peloton en plaçant une attaque à 500 m de la ligne, prenant 1 s sur le maillot jaune et les favoris à la victoire finale.
Au niveau des classements, Adam Yates garde son maillot jaune pour 3 s sur Primož Roglič et 7 s 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 Pogačar, 3e au classement général, porte le maillot blanc du meilleur jeune à 6 s du Colombien Egan Bernal, vainqueur du dernier Tour. EF Pro Cycling est en tête du classement par équipe.