Kieran Agard's second half strike was enough to give the Robins victory but Latics can take a lot of positives from the performance.
Substitute Dominic Poleon had Latics' best chance with 15 minutes remaining but they could not unfortunately get the leveller.
The game started at an intense pace with the league leaders enjoying a lot of the possession.
It was Latics that could have taken the lead in the opening two minutes of the game. James Dayton picked out Jabo Ibehre in the centre and the striker's flick just went side of the goal.
It did not take long for Bristol to take control of proceedings as they pressed high up the pitch causing Latics into errors.
On seven minutes, Joe Bryan's cross looped over the head of Paul Rachubka and scraped the top of the crossbar before going over.
City strikers Aaron Wilbraham and Kieran Agard were causing Latics' defence problems with their pace, power and height but they defended resolutely.
Latics started to look threatening on the counter attack with Liam Kelly and Mike Jones finding more space in the midfield.
As the visitors came back into the game, Dayton and Jonathan Forte combined midway through the half but the the winger's effort smashed over the crossbar.
Rachubka had to be alive just a minute later as he superbly tipped Agard's volley wide after being played through on the edge of the box.
It was all end-to-end action at Ashton Gate and Latics had their best chance of the game ten minutes from the break. Joseph Mills bombed down the left wing before passing into Forte who saw his shot deflected wide of the goal.
From the resulting corner, Forte headed over from Mills' cross with goalkeeper Frank Fielding stranded.
Both sides went into the break level and manager Lee Johnson would have been happy with what he saw from his side.
Latics started the second half brightly, enjoying slightly more possession than their hosts but were struggling to calve out clear cut chances.
Two minutes into the half, Jones played the ball onto the head of Forte but the winger could not connect properly and the chance went begging.
Dayton was presented with acres of space to run into on 50 minutes but attempted to pick out Danny Philliskirk in the centre when he could have had a shot himself.
Latics were made to rue that chance as the Robins took the lead on 57 minutes. A well worked free kick saw Wade Elliott play it short Wilbraham and he played it into the path of Agard who confidently slotted past Rachubka to give the hosts the lead.
Bristol City could have extended their lead on the hour mark as they broke from a Latics corner. Luke Freeman volleyed for Agard to chase; he picked it up on the half way line and tried an audacious chip over Rachubka and fortunately for Latics, his shot fell inches wide.
The game started to become scrappy with both sides struggling to keep any of the ball.
Carl Winchester was introduced into the game and provided a spark, beating his man and getting to the byline but the ball unfortunately run out of play.
That was the catalyst for Latics to attack the league leaders and they were almost rewarded on 75 minutes.
Superb passing and moving in the midfield provided substitute Dominic Poleon a sight of goal inside the penalty area. He smashed his effort goalwards but somehow Fielding managed to tip it over the bar.
The Robins should really have extended their lead ten minutes from time but Latics' defence held out well. Joe Bryan's initial shot was saved by Rachubka and as Agard poached, Latics defended on the goal line to keep the score to only one.
Latics were not giving up their unbeaten run without a fight and piled forward to get something out of the game. Connor Brown tried his luck from 30 yards but it just went wide.
Deep into added time, the ball looped in the air just underneath the goalkeeper's box; Ibehre was there but the referee believed the striker had fouled the goalkeeper.
Latics did not give up. In the final minute of added on time Jones' cross into the box trickled across the goal but no Athletic player could get on the end of it and the referee blew time on the game, ending Latics' 13 game unbeaten run.
Bristol City: Fielding, Little, Williams, Flint, Smith, Elliott, Freeman (Wagstaff 90'), Wilbraham, Agard (Emmanual-Thomas 87'), Ayling, Bryan.
Subs not used: Richards, El-Abd, Cunningham, Burns, Pack.
Oldham Athletic: Rachubka, B.Wilson (Brown 72'), J.Wilson, Kusunga, Mills, Jones, Kelly, Dayton (Winchester 72'), Forte (Poleon 64'), Philliskirk, Ibehre.
Subs not used: Etheridge, Dieng, Mellor, Bove.
Goals: Bristol City (Agard 57') 1-0 Oldham Athletic
Attendance: 12,696 (490 visiting supporters)