Colorado scored all of its runs with two outs in support of rookie Kyle Freeland (8-4), who pitched six innings before three relievers finished up.
The Rockies have won eight of nine games against the Giants this season, including seven in a row. That is Colorado's longest winning streak in franchise history against any National League West opponent.
The win was the fourth straight for the Rockies (45-26), their 11th in 14 contests and moved them a season-high 19 games above .500.
The Giants (26-44) have lost five straight contests and 14 of their past 18 to fall a season-high 18 games below .500. They trail the first-place Rockies by 18 1/2 games, the first time the Giants have been that far from first place prior to the All-Star break since 1985.
Tony Wolters singled home the Rockies' first run in the second inning and another in the seventh. Pinch hitter Pat Valaika followed Wolters in the seventh with a run-scoring double -- Colorado's only extra-base hit after 13 singles. Every player in the starting lineup, including Freeland, had at least one hit.
Trevor Story put the Rockies ahead 2-1 when he grounded a single up the middle with two outs in the fifth, scoring Ian Desmond. Carlos Gonzalez walked, and Desmond took third on a passed ball before Story drove in his fifth run in six games.
Nolan Arenado's two-out single in the sixth boosted the Rockies' lead to 3-1. The hit scored Raimel Tapia, who singled with one out and moved to second on a groundout. Tapia has recorded four straight multi-hit games and five consecutive multi-hit starts.
With runners on first and second in the sixth, Freeland struck out pinch hitter Brandon Belt to end the inning and his 94-pitch workday. He got 11 outs on ground balls while giving up eight hits and one run with two walks and three strikeouts. It was Freeland's team-leading 10th quality start and lowered his ERA to 3.42. For the first time in seven starts, Freeland did not allow a home run.
The left-handed hitting Belt represented a power threat but one with severe limitations as of late. He is 0-for-18 with just two hits in his past 29 at-bats and does not have a hit in his past 23 at-bats against left-handed pitchers. Freeland fell behind him 2-0 but struck him out on a 3-2 fastball clocked at 92.3 mph.
Three straight two-out singles in the second, the last by Wolters, gave the Rockies a 1-0 lead. Gorkys Hernandez tied the game at 1 with a two-out single in the fourth. The hit scored Nick Hundley, who doubled into the right-field corner with one out.
Back-to-back singles by Hunter Pence and Buster Posey against Scott Oberg put runners on the corners with two outs in the seventh. But Oberg struck out Austin Slater to end that threat.
Matt Cain (3-6) gave up two runs (one earned) and nine hits in five innings in his 39th career start against the Rockies, the most by any pitcher in major league history. Cain is 17-11 against the Rockies overall and 6-5 at Coors Field.
The Giants went 1-for-7 with runners in scoring position and stranded 10 runners.
NOTES: Rockies 3B Nolan Arenado was charged with his first error of the season when he was unable to come up with C Nick Hundley's grounder in the second. ... Rockies RHP Chad Bettis (cancer) is scheduled to throw 15 fastballs Sunday in a bullpen session, his first at 60 feet, 6 inches with the catcher positioned behind home plate. ... Giants LHP Madison Bumgarner was scheduled to throw around 30 pitches in a simulated game at the team's complex in Scottsdale, Ariz. ... Giants 1B Buster Posey (left ankle) was cleared to catch and will do so Sunday but started at first base. ... Giants CF Denard Span and SS Brandon Crawford were given a day of rest, and 2B Joe Panik might rest Sunday. ... Giants INF Eduardo Nunez (left hamstring) is available in an emergency but likely won't return to the lineup before Monday at Atlanta. ... Rockies CF Charlie Blackmon did not start for just the second time this season. ... The Giants, who lost the first two games of the series 10-9 and 10-8, are the first team to score at least eight runs in each of back-to-back losses since the Rockies in August did so in August 2015. The last time the Giants had consecutive losses of that kind was September 2006 at Milwaukee.