The Marlins kept the game going when Marcell Ozuna tripled in a run in the ninth to bring about a 2-2 tie.
Cincinnati then roughed up reliever Steve Cishek in the 10th to win its sixth straight game. The Marlins lost their fifth in a row and have won just 11 times in 41 outings this season.
Cishek (1-4) faced only three batters in the ninth, but quickly ran into trouble in his second inning of work.
Donald Lutz opened the inning with a single, Shin-Soo Choo drew a walk and both runners moved up on a sacrifice by Zack Cozart. Joey Votto was walked intentionally to load the bases, after which Brandon Phillips lifted a sacrifice fly to left that brought in the go-ahead run.
Bruce, who drove in Cincinnati's first run with a fourth-inning single, followed with a double to right to score Choo and Votto.
The win went to Aroldis Chapman (3-1), who replaced starter Mat Latos in the ninth. J.J. Hoover picked up his third save even though he allowed a two-out, RBI single to Matt Diaz in the bottom of the 10th.
Pot vending machine to debut
Pistorius testifies he didn't consciously pull trigger when he shot girlfriend