Giants left-hander Jeremy Affeldt opened the fourth inning by walking the bases loaded before Cubs catcher Dioner Navarro's two-run single. Chicago first baseman/catcher Steve Clevenger followed with a RBI single to put the Cubs ahead, 3-1, and knock out Affeldt.
"[Affeldt] looked good the first hitter, but he just got out of sync and got a little quick out there," Giants manager Bruce Bochy said.
Clevenger finished with two RBIs on the day.
Both of the game's starting pitchers twirled solid three-inning outings.
Cubs right-hander Carlos Vilanueva surrendered four hits -- one a solo home run to Pablo Sandoval -- and struck out two.
Villanueva came up in the Giants organization, and knew Sandoval. The Cubs right-hander wasn't surprised when Sandoval connected, even though the pitch was ankle-high.
"It was exactly where I wanted to throw it," Villanueva said, shrugging his shoulders.
Maybe he should've thrown it down the middle.
"Maybe he would've popped it up -- you never know," Villanueva said.
Giants righty Yusmeiro Petit -- filling in for Tim Lincecum (blister) -- allowed one hit and struck out one.
Sandoval's third-inning blast continued the Giants third baseman's hot hitting; Sandoval, who now heads to play for Venezuela in the World Baseball Classic, is hitting .500 (7-for-14) with two doubles and three RBIs in his first six Cactus League games.
Up next: The Cubs will play the first of their five split-squad games this spring on Sunday, facing the Brewers at HoHoKam Stadium in Mesa and the Angels in Tempe. Edwin Jackson will make his second spring start in Mesa vs. the Brewers. It also will be first baseman Anthony Rizzo's last game with the Cubs before he leaves to join Team Italy in the World Baseball Classic. Nick Struck, who was the Cubs' 2012 Minor League Pitcher of the Year, will start against the Angels, a game which can been seen on MLB.TV. The Cubs-Brewers game will be an exclusive webcast on Cubs.com.