PITTSBURGH -- Matt Garza provided the edge, even if it ended his night early.
Garza was ejected in the fifth inning after hitting reigning NL MVP Andrew McCutchen for a second time. The bullpen stepped in and kept the surging Pirates at bay with 4 1/3 shutout innings. The Brewers scored the game's only run on when Elian Herrera sprinted home on Logan Schafer's sacrifice fly off Mark Melancon (3-5) in the ninth.
Milwaukee drew within 3½ games of the Pirates for the last playoff spot with eight days left in the regular season by winning for just the second time in its last 13 road games.
"We knew what we had to do and we know how things have been going," manager Ron Roenicke said.
The Brewers celebrated loudly in the hallway leading to the clubhouse, the kind of fire that's been missing during their lengthy September swoon. Garza, however, stoked the fire with 4 2/3 strong innings. His work included two run-ins with McCutchen.
Garza hit the Pittsburgh star center fielder on the left shoulder in the third then grazed McCutchen's elbow with the bases empty two innings later. Both plunkings came with two outs and the bases empty, hardly the kind of pitches meant to send a message.
"If people think I hit McCutchen on purpose, with a 1-2 count in a game like this, then you're just an idiot," Garza said.
Garza had hit just two batters in 158 innings coming in. McCutchen -- who went to the disabled list in August with fractured rib cartilage shortly after getting drilled while playing in Arizona -- figures Garza was just trying to work inside when the pitches got away from him.
"He didn't try to hit me but he got it in and I'm sure he's thinking it's better he hit me than me hit him with a homer or double or something," McCutchen said.
Zach Duke (5-1), a former All-Star with the Pirates, picked up the victory after getting the final out of the eighth. Francisco Rodriguez worked a perfect ninth for his 43rd save of the season and 347th of his career, moving him into a tie with Randy Myers for 10th on the all-time list.
Herrera reached on a forceout off Melancon (3-5) in the ninth and moved to third on Lyle Overbay's second double of the night. Herrera scored when Schafer's fly to left was just deep enough.
The Pirates left 10 runners on base and went 0 for 8 with men in scoring position.
"The pitchers were out there and kept putting up zeroes," Pirates manager Clint Hurdle said. "We had some opportunities and couldn't push a run across and they got one late."
Pittsburgh starter Edinson Volquez retaliated after the first plunking by throwing inside to Milwaukee star Ryan Braun, earning a warning to both benches, making Garza's ejection automatic even as he pled his case to home plate umpire Marty Foster.
"He just told me, `In this type of situation, my hands are tied," Garza said. "I said, `Come on, you know it.' He's like, `Yeah, I know' and all three umpires over there are like, `You've got to understand the situation."
Garza's unexpected departure forced the Brewers to rely on an already taxed bullpen that had blown games on Thursday and Friday.
This time a string of six relievers stood firm after letting late leads slip away earlier in the week. The Pirates loaded the bases with one out in the eighth but Starling Marte lined to third and pinch-hitter Gaby Sanchez grounded out to short against Duke.
Volquez lacked Garza's crispness early, needing 52 pitches to labor through the first three innings alone, but continued his remarkable bounce back season. The pitcher who went 9-12 with a 5.71 ERA a year ago while pitching for San Diego and the Los Angeles Dodgers lowered his ERA to 3.15 by keeping the Brewers off the scoreboard before exiting in the seventh..
Brewers: RHP Wily Peralta (16-10, 3.70 ERA) makes his 31st start of the season on Sunday. He is 2-1 with a 4.32 ERA in four career starts against the Pirates, all of the starts coming at Miller Park.
Pirates: RHP Vance Worley (7-4, 3.18 ERA) returns to the rotation after making a brief move to the bullpen when Charlie Morton was taken off the disabled list. Worley is 0-3 with a 5.48 ERA in four career starts against Milwaukee. He gave up four runs on 12 hits in a 4-3 loss to Milwaukee on Aug. 24.