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 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 regular-season 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.
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. It was the first game for the left-hander since he left a July 20 start at the Chicago White Sox with a bruised left wrist.
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.