The Finn had lead from the start after holding off Hamilton but a nicely timed safety car gifted Hamilton the lead after Bottas had already made his opening pitstop and the defending champion would not relinquish his grip on first.
Charles Leclerc rounded out the podium as he took home third place after a race filled with thrilling battle between him and Max Verstappen. The Dutchman came home fifth behind Red Bull Racing team-mate Pierre Gasly after he was hit by Sebastian Vettel.
The incident between the two cost Verstappen a podium and saw Vettel receive a penalty and drop to the back and finished a lowly sixteenth.
Carlos Sainz Jr. drove an excellent race to recover from thirteenth on the grid to finish sixth after he held off the Renault F1 Team of Daniel Ricciardo who finished seventh.
Kimi Räikkönen kept up his strong Silverstone record with an eighth place finish ahead of the Scuderia Toro Rosso of Daniil Kvyat while Nico Hülkenberg snatched the final points paying position on the final lap to deny Alexander Albon who ended the race twelfth.
A cruelly timed safety car cost Lando Norris a points finish in his home race as he finished eleventh.
Lance Stroll ended the race thirteenth ahead of the two Williams Racing with Vettel and Sergio Pérez the final cars over the line.
Three drivers retired as both Haas F1 Team dropped out the race early following a collision between the two on the opening lap and Antonio Giovinazzi spun out.
Bottas held off his team-mate when the lights went out while Vettel got ahead of the Red Bull of Gasly. The majority of the field got through the opening sequences of corner without incident apart from the two Haas cars who collided on the exit of turn five. Both cars suffered rear punctures and were forced to limp back to the pits. Kevin Magnussen managed another seven laps before returning to the pitlane to retire his Haas. Romain Grosjean would join him on the side lines not long after.
Hamilton gave the crowd something to cheer as he took the lead for all of two corners as Bottas fought back as the silver arrows battled over the lead of the British Grand Prix in the opening laps before the Brit dropped back a little to stay out of the dirty air of his team-mate.
The two Scuderia Ferrari’s and Red Bull’s were putting on a show for the crowd as they all fought over third place with Leclerc and Verstappen reviving their battle from two weeks ago in Austria while Vettel and Gasly kept them both honest.
Gasly was the first of top six to pit and put on a set of hard tyres with Leclerc and Verstappen both reacting to the Frenchman. Great work by the Red Bull team got the Dutchman out in front of Leclerc but the Ferrari got back ahead of Verstappen after the Red Bull ran wide at turn four. Those two continued to battle with the Dutchman getting annoyed at the defence of the Ferrari.
The battle for the best of rest saw Norris get past Ricciardo on the opening lap but the undercut worked a treat for the Renault as Ricciardo got back past the Brit in the opening round of stops but the race would get a huge twist when the Alfa Romeo Racing of Giovinazzi spun out at Vale and found the gravel and importantly, brought out the safety car as he beached the car.
With the safety car deployed, it was free pit stop for the two drivers at the front that had not pitted and saw Hamilton claim the lead as he got past Bottas just as it was looking like his overcut attempt had failed. Vettel was the other one of the top six to gain from the safety car as he made his stop and jumped up to third while Verstappen and Leclerc also pitted under the safety car but dropped to fifth and sixth.
Sainz was another driver to benefit from the safety car as he made his stop and came out in seventh as the racing got back underway with Hamilton now leading Bottas from Vettel, Gasly, Verstappen, Leclerc, Sainz, Norris, Albon and Hülkenberg the top ten.
The top nine all stayed the same in the opening corners but Pérez locked up at the end of the wellington straight and clipped the back of Hülkenberg and lost his front wing while the Renault dropped to twelfth.
Verstappen and Leclerc continued their battle with both drivers getting their elbows out with the Ferrari driver barging his way past the Dutchman, but the Red Bull fought back before moving onto the back of the other Ferrari.
Verstappen closed in on Vettel and made a move round the outside on the hanger straight but the two collided at Vale as the Dutchman moved to defend the inside and the Ferrari locked up and hit the back of the Red Bull. Both drivers spun off into the gravel but unlike Giovinazzi, were able to keep going with Verstappen dropping to fifth while Vettel needed to stop for a change of front wing and returned in seventeenth place. He was also given a ten second time penalty for the incident.
The incident moved Leclerc up into the final podium position and gave Bottas a big enough gap to make his final pitstop. The new set of tyres allowed the Finn to set the fastest lap but the bonus point would be snatched away from him by his team-mate on the final lap.
The final few laps saw the battle in the lower points heat up with Sainz and Ricciardo doing battle for sixth place while Räikkönen in the sole remaining Alfa Romeo fought off the two Toro Rosso’s but Albon’s brave defence in the points failed in the final laps as he dropped to twelfth.