Les trois derniers rescapés de l'échappée du jour (Alessandro De Marchi (Team Jayco-AlUla), Rune Herregodts (Intermarché-Circus-Wanty) et Oscar Onley (Team DSM)) sont rattrapés à 6 kilomètres du but par le peloton. Alors que la victoire semblait destinée à un sprinteur, une importante chute a provoqué plusieurs cassures dans le peloton à 4 kilomètres environ de l’arrivée. Primož Roglič émerge sur la ligne d'arrivée en conservant une légère avance sur Remco Evenepoel qui fondait sur lui.
Dernier membre de l'échappée de huit hommes, Simon Carr (EF Education) est repris dans la dernière ascension de l'étape menant à Vallter 2000 à 6,3 km du sommet. Quelques instants plus tard, son coéquipier Esteban Chaves attaque et prend de l'avance sur le groupe des favoris. Derrière le Colombien, sous l'impulsion de Mikel Landa puis de Remco Evenepoel, ce groupe s'égrène pour finalement ne plus compter que trois unités : Evenepoel, Primož Roglič et Giulio Ciccone. Chaves est repris et dépassé aux 500 mètres. La victoire se joue au sprint où Ciccone s'impose devant Roglič et Evenepoel.
Maxim Van Gils (Lotto Dstny), le dernier des sept fuyards du jour, est repris par le peloton dans l'ultime ascension, à 8,5 km de l'arrivée. Quatre kilomètres plus loin, Remco Evenepoel attaque. Seul, Primož Roglič parvient à suivre le train du Belge champion du monde mais ne prend aucun relais. À 350 mètres du but, Evenepoel accélère de nouveau et parvient à décrocher le Slovène pour remporter l'étape avec 2 secondes d'avance.
Dans l'ascension final de Lo Port (9,4 km avec une pente moyenne de 8 %), l’Éthiopien Tsgabu Grmay (Jayco AlUla), dernier rescapé de l’échappée, est repris à 6 km de la ligne. Au passage sous la flamme rouge, quatre hommes sont en tête : les deux premiers du classement général Primož Roglič et Remco Evenepoel ainsi que les coéquipiers du team UAE Emirates João Almeida et Marc Soler. Bientôt, Roglič et Evenepoel se retrouvent seuls en tête. Dans les tout derniers mètres, le Slovène laisse sur place le Belge qui craque et s'impose avec 6 secondes d'avance.
L'échappée de six coureurs est reprise à 32 kilomètres du terme. Moment choisi pour Marc Soler pour s'isoler en tête. Cinq kilomètres plus loin, Remco Evenepoel sort à son tour du peloton immédiatement suivi comme son ombre par Primož Roglič. À 21 km du terme le duo Evenepoel-Roglič revient sur Soler pais lâche celui-ci. Mais Roglič refuse de prendre le moindre relais et Evenepoel, las de la non collaboration du Slovène, finit par couper son effort à 9 km de l'arrivée provoquant un regroupement général. La victoire se joue ainsi au sprint et Kaden Groves, déjà vainqueur deux jours plus tôt, s'impose avec une demi-longueur d'avance sur Bryan Coquard.
Neuf fuyards font la course en tête avant d'être progressivement repris par le peloton à une petite trentaine de kilomètres sur le circuit local de Montjuïc que les coureurs accomplissent six fois. À 28,5 km du terme, la bagarre tant attendue en vue de la victoire au classement général prend corps à la suite d'une attaque tranchante de Remco Evenepoel, deuxième du classement à 10 secondes de Primož Roglič. Comme la veille, le Slovène, leader du classement général, saute dans la roue du champion du monde et le suit. Dans les deux dernières montées de la côte de Montjuïc, Evenepoel accélère encore en vue de décrocher Roglič mais en vain. Les deux hommes se présentent à l'arrivée où Evenepoel s'adjuge l'étape alors que Roglič conserve définitivement son maillot vert et blanc de leader du classement général.