With the victory, Milwaukee kept pace with Chicago in the NL Central. The Brewers and Cubs remain tied atop the division standings for the third consecutive day.
"That's why they're in first place right now," said Reds starter Aaron Harang of the Brewers. "They're able to capitalize on situations. They're a scrappy team. They scratch and claw to work their way back into games. That's how they've been all season."
Harang allowed two earned runs on seven hits in seven innings. He walked two and had seven strikeouts in a 113-pitch effort. He became the first Reds pitcher to throw 200 innings three consecutive seasons since Jose Rijo did it in 1993.
Reds rookie first baseman Joey Votto hit his second big league home run in the loss.
Brewers starter Jeff Suppan and four relievers combined to limit the Reds to just four hits.
"It was one of those days," said Reds interim manager Pete Mackanin. "Suppan just shut us down. We didn't have much offense other than the Votto home run. That was the name of the game. When you get four hits, you're not going to win many games."
Harang looked sharp early, allowing just two hits in the first four innings.
With two on in the second, Votto took an inside pitch from Suppan to the opposite field, depositing it in the left-center-field seats to put the Reds ahead, 3-0.
It was Votto's second home run in just eight Major League at-bats. Since being recalled from Triple-A Louisville on Tuesday, Votto is batting .500 with two home runs and six RBIs.
The defense behind Harang was stellar.
Norris Hopper made a running catch against the left-center-field wall to rob Gabe Gross of an extra-base hit in the first inning.
Ken Griffey Jr.'s sliding catch of Suppan's line drive prevented a run in the third.
Griffey later made a backhanded catch of Ryan Braun's foul ball in the fifth.
The Brewers had the bases loaded in the fourth, but Harang struck out Geoff Jenkins and got Damian Miller to fly out to right to end the inning.
The Brewers scored their first run when Suppan trotted home on a groundout to second by Gross.
"That ball was hit a lot slower than we wanted it to be," said Harang.
Suppan allowed three earned runs -- all coming on Votto's homer -- on three hits in six innings. He walked one and struck out four.
Milwaukee's rally continued with Prince Fielder leading off the sixth with his 43rd home run of the season to make the score 3-2.
"I left the breaking ball up," said Harang of the pitch to Fielder. "If I get the pitch down, maybe he doesn't hit it out. His approach looks like he tried to see it and hit it. He takes a good rip at everything he sees."
Fielder helped the Brewers tie the score in the eighth when he walked and scored on Jenkins' sacrifice fly just ahead of Griffey's throw to the plate.
"I thought Griffey was going to throw him out," said Mackanin. "He just pulled the throw up the line a little bit."
Derrick Turnbow (4-4) pitched a perfect eighth inning to earn the victory for Milwaukee.
Craig Counsell singled to left leading off the ninth against David Weathers. Moments later, Weeks tripled to right-center field, scoring Counsell, to give the Brewers a 4-3 lead.
"I was a little lost, it had been awhile," said Weathers, who hadn't pitched since Monday.
Weathers (2-5) allowed one run on two hits in one inning to take the loss. Jared Burton, who allowed the tying run in the eighth, suffered his third blown save of the season.
"The bullpen let us down," said Mackanin.
Reds shortstop Alex Gonzalez left the game after the sixth inning after fouling a ball off his left shin. X-rays taken on the shin were negative.
Milwaukee closer Francisco Cordero retired the Reds in order in the ninth for his 41st save of the season.
"That's why they're battling for a divisional championship," said Weathers of the Brewers. "I have a lot of buddies over there. When they're not playing us, I root for them. They're putting it together. They have a lot of character."