Fonseca mette Cristante al centro della retroguardia, gioca anche Fazio. Pioli schiera in difesa la coppia Kjaer–Tomori, Romagnoli in panchina, Rebic preferito a Leao. Inizio impressionante del Milan: al 4’ Pau Lopez è provvidenziale in uscita su Tomori, poi Mancini respinge sulla linea la conclusione di Ibrahimovic, Tomori ribadisce in rete ma è in fuorigioco e il gol viene annullato, così come quello di Ibra servito da Rebic al 9’, in mezzo, al 5’, sempre lo svedese di tacco mette incredibilmente fuori da due centimetri.
Al 22’ prima grande occasione per la Roma: sponda di Borja Mayoral per Veretout, destro al volo troppo centrale. Al 27’ angolo di Calhanoglu per Kjaer che di testa colpisce la traversa. Al 28’ un gol annullato anche ai giallorossi con Mkhitaryan che mette dentro ma Mancini ha commesso fallo su Kjaer. Al 33’ Rebic, inarrestabile, raccoglie un assisti di Theo Hernandez ma Pau Lopez devia in angolo il suo sinistro. Al 35’ ancora Rebic per Saelemaekers sul quale Pau Lopez compie un altro miracolo.
Al 36’ Mkhitaryan per Pellegrini, doppia conclusione, la prima respinta da Donnarumma, la seconda da Calabria. Al 38’ ancora Mkhitaryan che, a tu per tu con Donnarumma, invece di tirare prova il pallonetto mancando la porta. Al 41’ rigore per il Milan assegnato da Guida col VAR per un fallo di Fazio su Calabria, Kessie come al solito trasforma anche se Pau Lopez aveva intuito sulla propria sinistra. Primo tempo pieno di occasioni clamorose da entrambe le parti ma Milan che lo chiude in vantaggio.
Calhanoglu non rientra in campo nella ripresa per un problema muscolare, al suo posto Brahim Diaz e proprio lui al 49’ innesca l’azione che porta alla conclusione Theo Hernandez, sinistro a lato di un soffio. Al 50’ la Roma pareggia: Spinazzola dalla sinistra tocca all’indietro per Veretout che fulmina di destro Donnarumma segnando il suo decimo gol in questo campionato. Al 54’ squadra di Fonseca vicina al vantaggio: Veretout per Borja Mayoral anticipato provvidenzialmente da Kjaer.
Al 56’ esce Ibrahimovic, già acciaccato nel primo tempo dopo un inizio devastante, per Leao, e due minuti dopo il Milan torna in vantaggio: palla persa di Pau Lopez, Saelemaekers se ne impossessa e dà a Rebic, nettamente il migliore in campo, che insacca di sinistro e poi esulta in maniera polemica. Dopo aver di nuovo seminato lo scompiglio nelle file giallorosse il croato deve uscire per infortunio, sostituito da Krunic.
Al 72’ Mkhitaryan riceve da Bruno Peres spalle alla porta, si gira e prova il sinistro a giro sull’incrocio dei pali fuori d’un soffio. Al 74’ Spinazzola per il colpo di testa di Bruno Peres che non impensierisce Donnarumma da posizione favorevole. All’80’ El Shaarawy, entrato da poco, serve in contropiede Mkhitaryan il cui destro viene respinto da Donnarumma. All’81′ Krunic da centrocampo quasi sorprende Pau Lopez che alza in angolo in extremis.
L’ultima occasione per la Roma è al 93’: Pellegrini crossa all’indietro per Pedro che svirgola, il pallone arriva a Mkhitaryan, destro centrale parato da Donnarumma. Con una grandissima prestazione il Milan torna a -4 dall’Inter mentre la Roma, pur giocando bene, conferma la sua idiosincrasia contro le grandi.