David Freese drove in two runs as St. Louis won for the fifth time in six games.
The NL East-leading Braves played without Jason Heyward, who is out with a broken right jaw after he was beaned during Wednesday’s 4-1 win at the New York Mets. The outfielder had surgery on Thursday in Atlanta and could miss the rest of the regular season.
Justin Upton hit his 24th homer, but the Braves lost for the second time in three games at the start of a six-game trip. Atlanta had won eight of its last nine games against St. Louis.
Kelly (5-3) allowed two runs and seven hits while improving to 5-0 with a 1.79 ERA in his last seven starts. St. Louis improved to 7-1 in Kelly’s eight starts since he rejoined the rotation on July 6.
Holliday went 2 for 3 and drove in a run, matching the amount of hits he had during a 2-for-24 slide over his previous six games. He doubled and scored in the fourth, then capped St. Louis’ three-run fourth with an RBI double that made it 4-2.
Freese had a run-scoring groundout in the fourth and an RBI single in the seventh.
Paul Maholm (9-10) came off the disabled list and allowed five runs, four earned, and five hits in 5 1-3 innings for Atlanta. Maholm helped himself with a leadoff single in the fifth. Upton then hit a one-out drive to center for his eighth homer this month, giving Atlanta a 2-1 lead.
St. Louis went back in front in the bottom half on consecutive run-scoring doubles by Matt Carpenter, Carlos Beltran and Holliday.