Manchester City remain on course to compete for silverware on four fronts this season and the first of those trophies is now within touching distance. Pep Guardiola’s team will face Arsenal or Chelsea in the Carabao Cup final at Wembley on 25 February after another masterclass from Kevin De Bruyne brought Bristol City’s terrific run to the semi-finals to a memorable end.

De Bruyne, who signed a new five-and-a-half-year contract 24 hours before this second leg, scored the winner with the last kick of the game but it was the wonderful assist for Sergio Agüero, four minutes after the interval, that took the breath away on a night when Bristol City refused to go quietly.

Lee Johnson puts Bristol City back on map and plots Premier League course Read more

Lee Johnson’s side contributed to their own downfall by handing Manchester City the lead two minutes before the interval, when Leroy Sané punished a mistake from Hordur Magnusson, and the Championship club could have been forgiven for surrendering when Agüero scored his 23rd goal of the season. Instead, they showed tremendous courage and spirit to claw their way back into the game through Marlon Pack’s towering header and Aden Flint’s injury-time equaliser to spark hopes of an improbable comeback.

De Bruyne, however, was not finished for the evening and tapped in a cross from Sané to restore their lead. When the final whistle followed seconds later, applause broke out from three sides of the ground as the Bristol City supporters got to their feet to acknowledge the efforts of a team that eliminated four Premier League clubs en route to the semi-finals, including Manchester United, and pushed Guardiola’s team all the way. “The fact is it’s taken them two injury-time goals in both legs to beat us,” said Johnson, the Bristol City manager.

Quick guide Bristol City player ratings Show Hide Bristol City Luke Steele First-half saves from both Silvas, including an excellent one low down, and not at fault for goals 7

Korey Smith Tried his hardest to contain Sané but had let him drift inside for first goal 6 Aden Flint Composed in defence; sent up front at very end and was on hand to tap in equaliser 6 Bailey Wright Excellent block of a goal-bound De Bruyne effort in first half and repeated that after break 6 Hordur Magnusson Should have cleared in build-up to Sané's opening goal; taken off at the interval 4 Josh Brownhill Strong and skilful break through the middle threatened to hurt the visitors 6 Liam Walsh Lucky to avoid a yellow for foul on David Silva in centre circle; substituted at half-time 5 Marlon Pack Let John Stones have header early on; good header of his own for goal to get hosts back in it 6 Joe Bryan Won ball back and can beat players, but wasted poor free-kick from good position 5 Jamie Paterson Frustrated as he failed to get involved on the left but did deliver cross for Pack's goal 6 Bobby Reid Pressure from hosts brought him more into game and his header set up Flint’s late tap-in 6 Subs Famara Diedhiou (for Walsh, ht) 6; Nathan Baker (for Magnusson, ht) 4; Ryan Kent (for Paterson, 73) 5 – Ratings by Conrad Leach Photograph: Hannah Mckay/X03696

For Guardiola, there was personal satisfaction to be taken from the fact that he will return to Wembley, the stadium where he won the European Cup as a player with Barcelona in 1992, and he expressed his happiness with an “amazing” first-half performance against Bristol City that prevented the home team from feeding off the energy of the raucous home support.

As for the idea that the first trophy of his reign is close, Guardiola politely made a point that the process, and not just the end result, should be cherished. “I know we will be judged for the titles, the trophies that we are going to win, but, I’m sorry guys, for the last six months we are so happy,” the Manchester City manager said. “We won a lot of games. Every weekend we were so happy. In the training sessions we were happy and that belonged to us. Nobody can take away what we have done. But, of course, all the teams are judged by the titles they are able to win and we are going to try.”

Agüero’s late header in the first leg had shifted the balance of this tie in Manchester City’s favour, especially with away goals counting only after extra time, but the Bristol City supporters had turned up daring to dream and determined to make themselves heard. There was a flag placed on every home fan’s seat and it was quite an atmosphere early on.

Facebook Twitter Pinterest Aden Flint scores Bristol City’s second goal in stoppage time. Photograph: Michael Steele/Getty Images

Manchester City, though, were dominant from the outset. They won a corner within 12 seconds and that set the tone for what followed as Guardiola’s team controlled possession and attacked with intensity. It was relentless at times and on the few occasions that the home team seized the ball, Guardiola’s players pressed aggressively and snapped at their heels to win it back almost immediately.

Manchester City’s Pep Guardiola looking at Aymeric Laporte and Fred Read more

Chances came and went for Manchester City, with the best of them falling to David Silva, whose angled shot was brilliantly turned away by Luke Steele, and it had started to look as though their opponents would get to half-time on level terms. They would have done but for a mix-up in their own area that culminated in Magnusson trying to shepherd the ball out of play. Bernardo Silva picked the left-back’s pocket and the loose ball ran into the path of Sané, whose low shot found the back of the net despite Flint’s best attempts to keep it out.

Johnson went for broke and introduced a second striker at the start of the second half but within four minutes of the restart the game appeared over. Sané released De Bruyne in one of those devastating counterattacks that start on the edge of their area and the Belgian showed some dexterous footwork before delivering an inch-perfect pass for Agüero, who took a touch before dispatching a superb shot beyond Steele and into the far corner.

Quick guide Manchester City player ratings Show Hide Claudio Bravo Good handling of high balls but his kicking has not improved 5 Kyle Walker Got into trouble before Pack’s goal but broke forward with usual hustle and energy 6 John Stones Dispossessed inside his own third, then beaten to the ball for cross that led to Pack goal 4 Nicolás Otamendi Argentina defender in to ensure no costly slips but late goals blotted his copybook 5 Olex Zinchenko Midfielder playing at left-back: out of position for Pack’s goal and let Reid in for second 4 Fernandinho Booked in first half when rolled, but kept the visitors ticking over 6 Kevin De Bruyne (man of the match) Supplied excellent pass on break for Agüero goal; added injury-time winner 8 David Silva One shot saved, another wastefully wide; helped set up the third but booked 7 Bernardo Silva Probed on the right and won tussle to set up Sané for his goal; faded after break 6 Sergio Agüero Hit crossbar by accident early on; took his goal very well, hitting across Steele 7 Leroy Sané Always lurked with intent; drifted into central area for his goal and set up De Bruyne 7 Subs Ilkay Gündogan (for Agüero, 82) 5; Danilo (for Walker, 85) 5 – Player ratings by Conrad Leach Photograph: Marc Atkins/Offside/Offside

Although Guardiola bemoaned the way his players “lost a bit of a control” after that goal, Bristol City deserve credit for their response. Pack, climbing high at the far post, emphatically nodded Jamie Paterson’s cross past Claudio Bravo before Flint tapped in to bring parity in the 94th minute. De Bruyne, fittingly, then had the final word. Guardiola’s response when he was asked how happy he was that the 26-year-old has signed a new contract, said it all. “You cannot imagine,” the Spaniard replied.