Match ends, Norwich City 3, Bristol City 2.
Leaders Norwich City twice came from behind to beat Bristol City and end the Robins' seven-match winning run in the Championship.
The visitors, beaten by Wolves in the FA Cup fifth round last Sunday, went in front when Jamie Paterson blasted past goalkeeper Tim Krul from close range.
Norwich equalised when Kenny McLean guided the ball in off the post, but Callum O'Dowda restored Bristol City's lead with a superb solo goal less than a minute later, weaving his way past a series of challenges before slotting home.
Ben Godfrey tapped in from close range to make it 2-2, before McLean's brilliant half-volley across goal completed the turnaround.
The home side went close to extending their advantage when Marco Stiepermann struck the bar in the closing stages, while Marley Watkins had the Robins' best chance to make it 3-3.
The Canaries maintained their two-point advantage over second-placed Leeds United, who beat struggling Bolton Wanderers.
Daniel Farke's side have built a reputation for late goals and comeback wins this season - and their resilience was again in evidence at Carrow Road.
Bristol City, who remain in the play-off places, were good value for their 2-1 lead but once Norwich had levelled for a second time they always looked favourites to go on to win.
McLean scored his first goals in English football to help the Canaries collect three points - the second an unstoppable shot to seal a fifth win in seven games.
Norwich City head coach Daniel Farke told BBC Radio Norfolk:
"It was an unbelievably complicated game against a really in-form side and you could feel in each moment the confidence of Bristol.
"In such games you have to accept there are different periods when sometimes you are on the front foot and sometimes the opponent is as they're two really good sides.
"It's important not to get too carried away when there's five minutes when your opponent is on the front foot.
"When you look at the 90 minutes it was a more than deserved win as for most of the periods we were on the front foot."
Bristol City manager Lee Johnson told BBC Radio Bristol:
"I thought the performance was energetic, I thought we worked hard, I thought first half we were very good in the way we pressed and countered.
"But there were still two or three individuals that I didn't think were at it, for whatever reason, and you can't afford to have that at levels like this.
"Second half we came out and the first five or six minutes we were fine, then for 20 minutes they blew us away and that was partly down to us making poor decisions in possession and partly down to their quality."
- 19TrybullBooked at 70mins
- 17BuendíaSubstituted forVrancicat 89'minutes
- 25HernándezSubstituted forKloseat 90+4'minutes
- 22PukkiSubstituted forRhodesat 85'minutes
- 22KalasBooked at 38mins
- 3DasilvaSubstituted forPalmerat 71'minutesBooked at 90mins
- 20PatersonSubstituted forWatkinsat 71'minutesBooked at 90mins
- 9DiedhiouSubstituted forTaylorat 71'minutes
- Gavin Ward
- Shots on Target
Second Half ends, Norwich City 3, Bristol City 2.
Kasey Palmer (Bristol City) is shown the yellow card for a bad foul.
Kenny McLean (Norwich City) wins a free kick on the right wing.
Foul by Kasey Palmer (Bristol City).
Corner, Norwich City. Conceded by Callum O'Dowda.
Marley Watkins (Bristol City) is shown the yellow card for a bad foul.
Kenny McLean (Norwich City) wins a free kick in the defensive half.
Foul by Marley Watkins (Bristol City).
Substitution, Norwich City. Timm Klose replaces Onel Hernández.
Corner, Bristol City. Conceded by Christoph Zimmermann.
Attempt missed. Jordan Rhodes (Norwich City) right footed shot from the centre of the box is high and wide to the right. Assisted by Marco Stiepermann following a fast break.
Substitution, Norwich City. Mario Vrancic replaces Emiliano Buendía.
Jordan Rhodes (Norwich City) wins a free kick in the attacking half.
Foul by Bailey Wright (Bristol City).
Jamal Lewis (Norwich City) wins a free kick in the defensive half.
Foul by Marley Watkins (Bristol City).
Substitution, Norwich City. Jordan Rhodes replaces Teemu Pukki.
Attempt saved. Andreas Weimann (Bristol City) header from the centre of the box is saved in the bottom right corner. Assisted by Callum O'Dowda with a cross.
Attempt missed. Marley Watkins (Bristol City) right footed shot from the right side of the six yard box is close, but misses the top right corner.