Bobby Reid's penalty was cancelled out by a superb Kevin De Bruyne strike early in the second-half. Sergio Aguero then snatched a goal in the second minute of injury time to take a 2-1 lead into the second leg at Ashton Gate.
The visitors were in dreamland when Reid was fouled by John Stones inside the penalty area. The local lad then stepped up and squeezed the ball past Claudio Bravo, whose slight touch was not enough to prevent Bristol from taking the lead.
Lee Johnson's side managed to do what every Premier League club has failed to do when playing at the Etihad this season - play without fear.
But despite heading into the tunnel with a deserved lead, the second-half was all Manchester City.
De Bruyne equalised to restore normality and then it was time for the City juggernaut to pile on the pressure. The Championship club managed to hold off the stampede until Aguero nodded home Bernardo Silva's delightful cross.
Speaking after the game, City manager Pep Guardiola has insisted his side must finish the job in the second-leg.
"It's a semi-final, I don't care what the competition is it's a semi final so it's not easy to reach and we knew they would be difficult opponents," Guardiola told BBC Radio 5 live.
"We created a lot of chances and that's why we win in the end, but today we knew we are not going to finish our job - that will have to happen away in Bristol when we travel there.
"They were really good, so we tried so hard, all the players tried and we're really happy."