Pep Guardiola’s men needed a strong second-half performance to come from behind to top their group ahead of RB Leipzig.
The Bundesliga side took an early lead when striker Loïs Openda beat goalkeeper Stefano Ortega with a slow roller after feeding Rodri to the ball.
He then continued to pile the misery on the towering winners by securing a brace on the half-hour mark before silencing the crowd.
After the break, Erling Haaland had his say and pulled one back after Julian Alvarez immediately popped off the bench in a heap. It is the 40th competitive goal for the Norwegian striker.
Phil Foden then put Guardiola’s side back in the driver’s seat with a compound turn and finished from inside the box before Alvarez found a late winner that likely won the Man of the Match award.
Man City Player Rating
Stefan Ortega (5/10): Beaten too easily for Openda’s second goal.
Kyle Walker (5/10): Out of position for the second goal and his usual leadership was lacking.
Ruben Dias (3/10): A stinker from the Portuguese, who was barged off the ball for the second goal and risked picking up a yellow card, which led to Guardiola hooking him at half-time.
Manuel Akanji (4/10): Misjudged Blaswich’s long kick for Openda’s opener, a rare error from the usually switched-on Swiss.
Josko Gvardiol (5/10): Could have done more to close down Openda for the second goal but made amends by setting up Foden’s equaliser.
Bernardo Silva (7/10): Provided the foundation for the fightback.
Rodri (5/10): Way below his usual high standards.
Rico Lewis (6/10): Missed a big chance to score in the first half. Kept the faith in the second.
Phil Foden (8/10): Recovered from a flat first half to play a hand in every goal. The sign of a top class player.
Erling Haaland (6/10): Scored his 12th goal in his last eight games against Leipzig to pull City back into it but missed big chances either side of that.
Jack Grealish (5/10): Not the best return after missing the Liverpool game although he also sustained a knock to the head. Upstaged by his replacement Doku.