SAN FRANCISCO -- Matt Cain pitched a gem more reminiscent of his standout rookie season than his hard-luck year of 2007.

Cain struck out eight in seven innings to win his third straight start, Bengie Molina homered and Randy Winn drove in two runs in the San Francisco Giants' sixth straight victory, 3-1 over the Colorado Rockies on Tuesday night.

Molina hit a solo homer in the sixth and also singled twice, and Winn's infield single in the third put San Francisco ahead and gave him a nine-game hitting streak. Winn then he added a sacrifice fly in the fifth. Rajai Davis scored both times and also doubled off the left-field wall for one of his two hits.

Cain (7-13) allowed a leadoff single to Kazuo Matsui in the first and didn't give up another hit until Cory Sullivan singled to start the sixth. After a two-out walk to Brad Hawpe in the second, the right-hander retired the next 10 Colorado batters before Sullivan's base hit.

The Giants played their 30th game in a stretch with 31 contests in a 30-day span, and are eagerly awaiting a day off Thursday before beginning a weekend series at Washington on Friday.

Barry Bonds went 0-for-4 before being replaced in left field in the eighth. He grounded out in the first, third and seventh innings and popped up in the fifth on a clear Bay Area night -- complete with a full moon in the distance behind the bleachers in right-center where he hit his 756th home run to break Hank Aaron's record earlier this month.

The 43-year-old slugger grounded into an inning-ending double play in the third -- one of three Giants' double plays in the first four innings.

Cain allowed four hits and one run with two walks. He owns his first three-start winning streak all year, earning his fourth victory in five starts on the heels of a five-start winless stretch in which he went 0-3. Yorvit Torrealba hit a two-out triple in the seventh, then Sullivan followed with an RBI double for the Rockies' first run. Cain received a mound visit from pitching coach Dave Righetti before striking out pinch-hitter Ryan Spilborghs.

Brian Wilson pitched out of trouble in the eighth and Brad Hennessey got the final two outs for his 13th straight save and 16th in 18 chances overall.

Colorado's Matt Holliday had his career-best hitting streak stopped at 17 games. It was the longest streak for the Rockies in four years.

Sullivan had three of the Rockies' seven hits, including two doubles.

Franklin Morales (0-2), a left-hander making just his third major league start, allowed two runs and six hits in five innings, but didn't strike out a batter while allowing three walks. But he kept from becoming the 449th different pitcher to surrender a homer to the Bonds.

Notes: Hennessey's saves streak is the longest by a Giants closer since Robb Nen had 12 in a row during the team's World Series season in 2002. ... Davis stole his 15th base and 10th since joining the Giants after the trading deadline. ... San Francisco 2B Ray Durham didn't start for the third straight game while resting his strained left hamstring. Durham said he might not be in the lineup again until after Thursday's off day when the club opens a series at Washington on Friday. In his place, Kevin Frandsen committed his fifth and sixth errors of the year. ... Rockies LHP Jeremy Affeldt was away from the team for the birth of his child. ... 3B Garrett Atkins' throwing error in the second was the first error in four games by Colorado.