En périphérie de Nancy et séparée de celle-ci par la Meurthe, Tomblaine est ville-départ pour la troisième fois en dix ans (après 2012 et 2014)[2]. L'étape met le cap au sud-est, d'abord vers Lunéville, la capitale ducale de Lorraine au XVIIIe siècle, le Versailles lorrain. L'entrée dans le département des Vosges s'effectue peu avant Rambervillers, où la route s'élève progressivement vers les ballons vosgiens pour atteindre Gérardmer et son lac (sprint intermédiaire, km 101,2), au pied de la première difficulté du jour, le col de Grosse Pierre (3,1 km à 6,4 %, 3e catégorie). Non répertorié, le col du Ménil précède le col des Croix (3,2 km à 6,3 %, 3e catégorie) qui ouvre la porte de la Haute-Saône. Depuis Fresse, le col de la Chevestraye (non répertorié) introduit le final de l'étape, avant de basculer dans la vallée du Rahin et la montée finale vers la super Planche des Belles Filles (7 km à 8,7 %, 1re catégorie), arbitre des 176,3 km de course[1]. En l'espace de dix ans, cette dernière est devenue une ascension référence dans l'histoire du Tour de France. D'ailleurs, cette étape est un clin d'œil à celle de 2012, lorsque l'ascension a été empruntée pour la première fois. Comme en 2019, l'ascension est prolongée d'un kilomètre sur un chemin non goudronné, dit en gravel, en impasse, avec une pente maximale à 24 %.
L'échappée peine à se former. De nombreux coureurs tentent de s'extirper du peloton, à tour de rôle. Finalement, elle se constitue, entre Gerbéviller et Rambervillers : l'Allemand Simon Geschke (Cofidis) est rejoint par le double champion du monde du contre-la-montre en titre italien Filippo Ganna (INEOS Grenadiers). Un groupe de dix coureurs fait la jonction avec le duo de tête : les deux Allemands de la Bora-Hansgrohe, Lennard Kämna et Maximilian Schachmann, l'Australien Luke Durbridge (BikeExchange Jayco), le Belge Dylan Teuns (Bahrain Victorious), les deux Danois Kasper Asgreen (Quick-Step Alpha Vinyl) et Mads Pedersen (Trek-Segafredo), l'Espagnol Imanol Erviti (Movistar), le Français Cyril Barthe (B&B Hotels p/b KTM), l'Italien Giulio Ciccone (Trek-Segafredo) et le Norvégien Vegard Stake Laengen (UAE Emirates).
Au sprint intermédiaire de Gérardmer (km 101,2), situé devant l'Hôtel les Sapins, Pedersen devance Geschke, avec une minute et quarante-cinq secondes d'avance sur le peloton, dans lequel le maillot vert belge Wout van Aert (Jumbo-Visma) précède son coéquipier français Christophe Laporte et le Néerlandais Fabio Jakobsen (Quick-Step Alpha Vinyl).
Une mauvaise entente règne dans le groupe de tête. Dans l'ascension du col de Grosse Pierre (3,1 km à 6,4 %, 3e catégorie), les meilleurs grimpeurs tentent de distancer les moins bons. Au sommet, Geschke passe en tête d'un groupe composé de Durbridge, Kämna, Schachmann et Teuns, avec deux minutes et quarante secondes d'avance sur le peloton. Barthe et Erviti parviennent à faire leur retour dans le col du Ménil (non répertorié). Au col des Croix (3,2 km à 6,3 %, 3e catégorie), Simon Geschke passe en tête devant Dylan Teuns, avec un avantage de deux minutes et quarante secondes sur le peloton.
L'ascension de la Planche des Belles Filles approche (7 km à 8,7 %, 1re catégorie). Au pied, l'échappée, qui a perdu Erviti, compte encore un avantage d'une minute et quinze secondes sur le peloton. Sur les terribles pentes qui mènent au sommet, l'échappée éclate et le peloton devient rapidement le groupe maillot jaune et approche dangereusement des hommes de tête, à moins d'une minute de retard. D'abord en tête, Geschke est repris par son compatriote Kämna, qui ouvre désormais la course. Dans le groupe maillot jaune, nombreux sont les coureurs à ne plus pouvoir suivre le rythme imprimé par l'équipe UAE Emirates du leader du classement général, le Slovène Tadej Pogačar (UAE Emirates), dans l'ordre, l'Australien Ben O'Connor (AG2R Citroën), le Colombien Daniel Martínez (INEOS Grenadiers), le Français Thibaut Pinot (Groupama-FDJ), le Russe Aleksandr Vlasov (Bora-Hansgrohe) ou encore le Kazakhstanais Alexey Lutsenko (Astana Qazaqstan). Simon Geschke est repris à trois kilomètres de l'arrivée, Lennard Kämna passe sous la flamme rouge, située au niveau de la Planche "classique", avec trente-cinq secondes d'avance. Dans le dernier kilomètre en chemin blanc, le coureur allemand de la Bora-Hansgrohe résiste tant bien que mal au groupe maillot jaune, qui n'est plus composé que d'une vingtaine de coureurs. À 200 mètres de l'arrivée, le Danois Jonas Vingegaard (Jumbo-Visma) attaque le maillot jaune Tadej Pogačar, d'abord distancé, il revient progressivement sur son concurrent direct ; tandis que Kämna est définitivement hors-jeu pour la victoire d'étape. Un vrai "mano a mano" s'organise dans les cinquante derniers mètres, avec une déclivité maximale à 24 %. Ces deux coureurs s'imposent comme les deux coureurs forts de cette 109e édition du Tour de France. Derrière, le Slovène Primož Roglič (Jumbo-Visma) coupe la ligne avec un retard de douze secondes. Malheureux du jour, Lennard Kämna termine quatrième, au côté du Britannique Geraint Thomas (INEOS Grenadiers). Le Français David Gaudu (Groupama-FDJ) finit sixième, l'Espagnol Enric Mas (Movistar) et le Français Romain Bardet (DSM) suivent à vingt-et-une secondes du vainqueur du jour.
Au niveau des différents classements, Tadej Pogačar conserve les maillots blanc et jaune, le Danois Magnus Cort Nielsen (EF Education-EasyPost) conserve son maillot à pois et Wout van Aert conforte le maillot vert. Simon Geschke est récompensé du prix de la combativité. L'équipe INEOS Grenadiers reste en tête du classement par équipes.