James Ward-Prowse hit the back of the net for the second time this season — and first in five games — giving Southampton a surprise lead with just 13 minutes gone at the Ethiad.
Sergio Aguero, who scored twice in the midweek League Cup win over Saints, would bring City level 20 minutes from full-time before Kyle Walker broke the deadlock nearing full-time.
Southampton fared far better than the 3-1 defeat to City on Tuesday, which saw the hosts fully dominate, taking a deserved lead into the break after Ward-Prowse bounced on a rebound from Stuart Armstrong’s shot.
Defensively, Saints looked a total different team to the one that shipped nine goals to Leicester City just over a week ago, and the insertion of goalkeeper Alex McCarthy has delivered a necessary confidence.
Walker, however, caught the defence out when he snuck a low cross in for Aguero to turn in for the equaliser.
McCarthy briefly took the life out the Ethiad with a sensational save to deny Bernado Silva from a similar position he was beaten from moments before.
The goalkeeper was not as lucky as City pinched a later winner four minute from full-time.
Angeliño sent in a cross that McCarthy tried to deflect aside, but it fell kindly for Walker, who turned goalscorer to the delight of the home support and the chagrin of the away end.
Southampton could not muster a comeback in the closing stages after were left deflated at the full-time whistle.
Manchester City: Ederson, Angeliño, Stones, Fernandinho, Walker, Bernado Silva (Foden 84), Gundogan, De Bryune, Sterling, David Silva (Jesus 46), Aguero (Otamendi 92)
Unused subs: Bravo (GK), Mendy, Mahrez, Cancelo
Goals: Aguero (70), Walker (86)
Bookings: Sterling (40), Gundogan (89), Ederson (90+5)
Southampton: McCarthy, Hojbjerg, Vestergaard, Stephens, Bednarek (Adams 88), Valery (Danso 75), Armstrong, Romeu, Ward-Prowse, Redmond, Ings (Djenepo 84)
Unused subs: Gunn (GK), Yoshida, Boufal, Long
Goals: Ward-Prowse (13)
Bookings: Hojbjerg (18)