Todd Frazier also homered and the Reds threw out two runners at the plate to end innings, overcoming homers by Marlon Byrd, Carlos Ruiz and Jimmy Rollins and sending the Phillies to their seventh loss in eight games.
The Reds threw out Byrd at the plate to end the sixth inning and Ruiz to end the seventh.
Alfredo Simon (8-3) allowed seven hits and three runs with three strikeouts in six innings. Jonathon Broxton pitched a scoreless eighth inning and Aroldis Chapman pitched the ninth for his eighth save.
The Reds wasted no time snapping their 17-inning scoreless streak, scoring in the first inning. Hamilton drew a leadoff walk, stole second on the first pitch to Skip Schumaker and hustled to third on Schumaker's groundout to Rollins at shortstop, setting up Bruce's sacrifice fly.
The Phillies answered with Byrd's two-run homer in the second, his ninth of the season.
Frazier led off the bottom of the second with his team-leading 13th homer of the season, giving him home runs in three of his past four games.
Frazier sparked Cincinnati's fourth-inning go-ahead rally with a single to right field and stolen base. Zack Cozart drove him in with a sinking line drive to right-center field that Ben Revere got a glove on with a diving try before the ball trickled away. Cozart went to third on Ramon Santiago's single and scored on Hamilton's sacrifice fly.
Hernandez (2-4), is 0-3 in seven starts since his most recent win on May 4, allowed four hits and four runs with three walks and two strikeouts in four innings. He also hit a batter.
Bruce followed Brandon Phillips' fifth-inning leadoff walk with his fourth homer of the season and first since April 20 against the Cubs in Chicago. The homer was his first in Cincinnati since April 3 and the 100th of his career at Great American Ball Park.
Ruiz led off the sixth with his second homer of the season, and Rollins hit a two-run shot in the seventh, his eighth homer of the season and second in two days.