
The future is maybe here?
Baseball is officially back. The San Francisco Giants kicked off their 2025 preseason schedule on Saturday against old friend Bruce Bochy and the Texas Rangers. The players got what they wanted, with a 6-1 win. Bob Melvin and Buster Posey got what they wanted, with a clean game that featured no errors, no stolen bases against them, and no major miscues or mistakes. And fans got what they wanted with the single most exciting thing that can happen in camp this year: a massive Bryce Eldridge home run.
The bulk of the Giants games this spring — including this opener — aren’t broadcast. And I’m not in Scottsdale. So I can’t really do much in the way of traditional recaps (nor will I recap every game).
What I can do is provide a little bit of context as to what happened, from listening to the game, perusing the box score, browsing social media, and doing a little research. So let’s break down how all the players did.
One important note: there is, thankfully, some Statcast data available for some of these Cactus League games, but it is not nearly as accurate as during the season. So take it with a little grain of salt … or don’t, it’s more fun that way.
One second note: a big thanks to MCC commenter StillCrazyAfterAllTheseYears, who mentioned in my article this morning that they would love to see stats separated based on who is the competition, since Spring Training has a wide range of talent and experience. So I’m trying to incorporate that context as much as possible.
Now let’s comb through the players.
The Hitters
Leadoff hitter: LaMonte Wade Jr. (DH)
1st PA: Strikeout swinging vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Flyout to center field vs. Tyler Mahle
3rd PA: Walk vs. Jacob Webb (in the Rangers’ bullpen)
Not much of note from Wade, who will likely DH a bit in the preseason to keep him healthy.
Leadoff replacement: Bryce Eldridge (DH)
1st PA: Strikeout looking vs. Daniel Robert (40-man up-and-down reliever)
2nd PA: 2-run home run to center field vs. Matt Festa (non-roster reliever, 5 years of MLB experience)
The top prospect in the Giants system by a mile made his Spring Training debut when he replaced Wade as the DH. In his first at-bat he was a 20-year old playing in his first Cactus League game. In his second at-bat, he was an 80-FV raw power slugger who is a consensus top prospect.
Eldridge wowed against Festa, who has 108 MLB appearances to his name. After taking one to measure, Eldridge took one to rake: the second pitch of the at-bat was 91.0-mph fastball taken for strike two, and the third pitch of the at-bat was a 91.5-mph fastball put well over the fence.
Here’s how Bryce Eldridge’s gargantuan blast sounded live on KNBR from the legend Jon Miller ⬇️
@justdelossantos pic.twitter.com/kAjRIyAoMp
— KNBR (@KNBR) February 22, 2025
According to the (again, slightly excitable) Statcast data, Eldridge hit his home run 450 feet, and with an exit velocity of 110.4 mph, and it would have been a home run in all 30 MLB ballparks. There is nothing that could have happened in the game that would have been more exciting than that.
No. 2 hitter: Marco Luciano (LF)
1st PA: Strikeout looking vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Groundout to second base vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Groundout to pitcher vs. Jacob Webb (in the Rangers’ bullpen)
Three things of note for Luciano:
First, while he’ll likely start the year in AAA, this game was a glimpse into where the organization views him. The Giants were resting a lot of their starters (including outfielders Heliot Ramos and Mike Yastrzemski), but you can still look at who started this game and who was subbed in and see a pretty clear line of delineation. The fact that Luciano got the start and was replaced by Wade Meckler would seem to signal that Luciano is currently ahead of Meckler (and arguably Grant McCray) on the depth chart.
Second, it was Luciano’s first career game in the outfield. By all accounts, he did well. Two balls were hit his way: a pop-up that he easily caught, and a double off the wall that, according to the radio and the reporters in attendance, was beautifully played off the wall by Luciano, who made a nice throw to second.
Third, his final at-bat was an out, but it was also listed at 111.6 mph. That’s huge, because Luciano’s ability to hit the ball hard was his single biggest calling card as a prospect, yet it seemed to disappear almost entirely in 2024. Luciano’s maximum exit velocity in the Majors in 2025 was just 108.1. And only four Giants — Matt Chapman, Jerar Encarnación, Michael Conforto, and Ramos — hit harder balls than Luciano’s fifth-inning out all last season. It was the hardest-hit ball in the game, by more than a full mph.
Encouraging stuff!
No. 2 replacement: Logan Porter (C)
1st PA: Groundout to second base vs. Daniel Robert (40-man up-and-down reliever)
2nd PA: Flyout to center field vs. Matt Festa (non-roster reliever, 5 years of MLB experience)
Nothing of note for Porter, who will likely be a critical depth piece in AAA Sacramento this year. He came off the bench to replace the starter, Sam Huff.
No. 3 hitter: Jung Hoo Lee (CF)
1st PA: Single to right field vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Strikeout swinging vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Groundout to first base off Jacob Webb (in the Rangers’ bullpen)
Lee was clearly excited to be back on the field after so long recovering from injury. He swung at the very first pitch he saw, and roped it into the outfield at 105.1 mph for a single. He also had a deep fly ball hit towards him that he tracked down well. Great to have him back!
No. 3 replacement: Grant McCray (CF)
1st PA: Strikeout swinging vs. Daniel Robert (40-man up-and-down reliever)
2nd PA: Solo home run to left field vs. Matt Festa (non-roster reliever, 5 years of MLB experience)
If there’s one thing we learned about McCray in his MLB debut last year, it’s that he has some outrageous power, and accompanies it with a lot of strikeouts. OK, fine, I guess that’s two things.
That was on full display Saturday, after McCray replaced Lee. In his first at-bat, he had three swing-and-misses. In his second at-bat, just a few moments after Eldridge’s bomb, McCray blasted one as well.
The Statcast metrics aren’t as impressive for McCray’s homer, which was hit at 100.8 mph, traveled 364 feet, and would have been out in just six MLB ballparks. But the fact that McCray went opposite field with the homer negates all of that. It was a thrilling swing, or so I imagine.
Cleanup hitter: Luis Matos (RF)
1st PA: Groundout to shortstop vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Popout to shortstop vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: RBI single to right field vs. Jacob Webb (in the Rangers’ bullpen)
68.7-mph singles may not be the stuff that highlight reels are made of, but two-out, opposite-field knocks with a runner in scoring position is certainly the stuff that gets the attention of the coaching staff. Matos, like Luciano, started in right field, and seems to be the frontrunner for a fourth or fifth outfield role.
Cleanup replacement: David Villar (1B)
1st PA: Strikeout looking vs. Cole Winn (40-man, likely up-and-down reliever)
2nd PA: Flyout to center field vs. Matt Festa (non-roster reliever, 5 years of MLB experience)
Villar is surely feeling the heat a little bit, and he certainly took note that he came off the bench, while Jake Lamb started at first base. Didn’t get a chance to show much in this game, though.
No. 5 hitter: Jake Lamb (1B)
1st PA: Single to right field vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Single to center field vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Strikeout looking vs. Jacob Webb (in the Rangers’ bullpen)
Going 2-3 is never a bad thing, though Lamb’s contact wasn’t particularly hard, and he was thrown out trying to score from second on a single, which was the only out made on the basepaths for the Giants.
No. 5 replacement: Wade Meckler (LF)
1st PA: Walk vs. Cole Winn (40-man, likely up-and-down reliever)
Meckler only got to see five pitches, and he didn’t get to swing at any of them. Still, nice to see him back in action.
No. 6 hitter: Sam Huff (C)
1st PA: 2-run home run to center field vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Walk vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Strikeout swinging vs. JT Chargois (non-roster reliever, 7 years of MLB experience)
A revenge game for Huff! A former top prospect for the Rangers — whose entire MLB career has been spent with the Rangers — Huff did work in this game with tremendous at-bats. He also called for a strike-zone challenge in the top of the first inning, and will forever be remembered as the first player to win an ABS challenge for the Giants. And then he smashed a 107.6-mph, 422-foot home run in the bottom half of the inning. It would have been a home run in 28 out of 30 ballparks.
No. 6 replacement: Sergio Alcántara (SS)
1st PA: Groundout to third base vs. Cole Winn (40-man, likely up-and-down reliever)
This limited role is probably what Alcántara, a non-roster invitee who is headed for AAA, will have all spring.
No. 7 hitter: Casey Schmitt (3B)
1st PA: Popout to second base vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Flyout to shortstop vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Double to left field vs. JT Chargois (non-roster reliever, 7 years of MLB experience)
Fun to see Schmitt get to play third base, where he’s at his best, but likely won’t get to play much this year. He’ll play a lot somewhere, though, if he consistently has at-bats like his third one, which was one of the best of the day for the Giants. In a 1-2 count against a reliever with tons of MLB experience, Schmitt roped a slider 360 feet at 108.3 mph. It was the third-hardest hit ball all day, by either team (trailing only Luciano and Eldridge), and would have been a home run in 13 MLB ballparks.
No. 7 replacement: Christian Koss (2B)
1st PA: Flyout to right field vs. Cole Winn (40-man, likely up-and-down reliever)
Koss only saw one pitch. He’ll likely be playing this type of role all spring, and battle Alcántara for emergency depth in AAA.
No. 8 hitter: Brett Wisely (2B)
1st PA: Double to left field vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Single to left field vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Popout to second base vs. JT Chargois (non-roster reliever, 7 years of MLB experience)
A very solid day for Wisely, who is right there with Schmitt in battling for the backup infield spot. While his second hit was a bit of a doink, his double was one of the best hit balls of the day. Against a quality MLB starter in Mahle, Wisely scorched the ball at 104.7 mph, and would have had a home run in five MLB parks.
No. 8 replacement: Sabin Ceballos (3B)
1st PA: Single to left field vs. Matt Festa (non-roster reliever, 5 years of MLB experience)
Ceballos came over from Minor League camp to provide some depth for the day — standard procedure. And he certainly made an impression! In his only at-bat he roped a 105.4-mph single off of a player with loads of MLB experience. It was the seventh-hardest hit ball of the day … pretty impressive for a player who has never played above A-ball! Ceballos, who came to the Giants in the Jorge Soler trade last summer, wasted no time turning heads.
No. 9 hitter: Osleivis Basabe (SS)
1st PA: Groundout to shortstop vs. Tyler Mahle (in Rangers’ rotation)
2nd PA: Groundout to second base vs. Jack Leiter (in competition for the Rangers’ rotation)
3rd PA: Groundout to pitcher vs. JT Chargois (non-roster reliever, 7 years of MLB experience)
Basabe batting ninth, but playing shortstop, tells you everything you need to know about the backup infield competition between he, Schmitt, and Wisely. He’s the best defensive option of that group, but the worst offensive option, and that was on display Saturday.
No. 9 replacement: Carter Howell (RF)
1st PA: Groundout to second base off Matt Festa (non-roster reliever, 5 years of MLB experience)
Howell also came over from Minor League camp. He’ll likely be in AAA at some point this year, so the impression he makes in camp certainly matters.
The Pitchers
Landen Roupp (RHP)
1st: Lineout to center field vs. Evan Carter (MLB regular, top prospect)
2nd: Strikeout swinging vs. Josh Smith (MLB regular)
3rd: Groundout to third base vs. Jake Burger (everyday player)
4th: Strikeout looking vs. Joc Pederson (All-Star slugger)
5th: Strikeout swinging vs. Adolis García (All-Star slugger)
6th: Walk vs. Kyle Higashioka (MLB regular)
7th: Groundout to shortstop vs. Nick Ahmed (non-roster infielder, 11 years of MLB experience, forever enemy of the Giants)
A dominant showing for Roupp, as he tries to leapfrog Kyle Harrison and Hayden Birdsong in the race for the fifth starter. He needed just 32 pitches to cruise through two no-hit innings, and threw 22 of them for strikes. He set the tone. Now it’s on Harrison and Birdsong to match it.
Enny Romero (LHP)
1st: Flyout to left field vs. Dustin Harris (40-man AAA depth piece)
2nd: Double to left field vs. Justin Foscue (40-man AAA depth piece)
3rd: Strikeout swinging vs. Evan Carter (MLB regular, top prospect)
4th: Strikeout looking vs. Josh Smith (MLB regular)
Romero, who is a non-roster invitee with a fair bit of MLB experience, and is trying to earn the second lefty relief role, started slow and ended strong. He threw 11 of his 12 pitches for strikes, which will surely catch the eye of his coaches, and he ended the inning with back-to-back three-pitch strikeouts against talented MLB hitters.
Kai-Wei Teng (RHP)
1st: Flyout to center field vs. Jake Burger (everyday player)
2nd: Lineout to center field vs. Joc Pederson (All-Star slugger)
3rd: Strikeout swinging vs. Adolis García (All-Star slugger)
After a wildly-disappointing 2024 which resulted in Teng being DFA’d and re-signed to a Minor League deal, the youngster bounced back strong in his 2025 debut. Like Romero, he threw 11 of 12 pitches for strikes, which is huge for someone who struggled mightily with control a year ago. And he followed up a pair of soft-contact outs with a swinging strikeout of a two-time All-Star.
Joel Peguero (RHP)
1st: Strikeout looking vs. Kyle Higashioka (MLB regular)
2nd: Groundout to shortstop vs. Nick Ahmed (non-roster infielder, 11 years of MLB experience, forever enemy of the Giants)
3rd: Double to center field vs. Dustin Harris (40-man AAA depth piece)
4th: Strikeout swinging vs. Justin Foscue (40-man AAA depth piece)
Peguero has been the talk of camp in the early going thanks to his high velocity. The non-roster invitee showed that off on Saturday, touching triple digits on four of his 14 pitches, while still finding the strike zone 12 times.
Cole Waites (RHP)
1st: Popup to third base vs. Cody Thomas (non-roster outfielder, some MLB experience)
2nd: Flyout to shortstop vs. Josh Smith (MLB regular)
3rd: Groundout to second base vs. Abimelec Ortiz (non-roster slugger in AA)
Waites pitched in a game for the first time since undergoing Tommy John surgery in 2023. He’s no longer on the 40-man roster, but could easily return to the Giants bullpen, and this was a big step towards that. His fastball sat in the 95-96 range most of the game, and he avoided hard contact.
Raymond Burgos (LHP)
1st: Lineout to left field vs. Blaine Crim (non-roster 1B in AAA)
2nd: Home run to center field vs. Trevor Hauver (non-roster OF in AAA)
3rd: Groundout to first base vs. Alejandro Osuna (non-roster slugger in AA)
4th: Strikeout swinging vs. Sebastian Walcott (non-roster top-5 prospect in AA)
Burgos could also work his way into the second lefty relief role, though giving up big homers to NRIs isn’t the best way to do it. He rebounded from that well, though.
Miguel Díaz (RHP)
1st: Groundout to first base vs. Cody Freeman (non-roster infielder in AA)
2nd: Strikeout looking vs. Cooper Johnson (AA player from Minor League camp)
3rd: Popout to third base vs. Cody Thomas (non-roster outfielder, some MLB experience)
Díaz, a non-roster invitee, didn’t get to face very good competition. But you can only play the people in front of you, and he did excellently, throwing nine of 11 pitches for strikes, and getting two very soft outs and a strikeout.
Justin Garza (RHP)
1st: Flyout to center field vs. Jax Biggers (AAA player from Minor League camp)
2nd: Double to right field vs. Abimelec Ortiz (non-roster slugger in AA)
3rd: Groundout to second base vs. Malcolm Moore (non-roster catcher in A-ball, 1st-round pick in July)
4th: Flyout to center field vs. Trevor Hauver (non-roster OF in AAA)
I know I’m supposed to be focused on the Giants, but two takeaways from this section: Jax Biggers is an 80-grade name, and the Rangers sure have a drastically different approach to non-roster invitees than the Giants do. Anyway, a nice showing by Garza, who threw nine of 13 pitches for strikes. His double was off of Villar’s mitt at first base, so it could have been a single or an out.
One game in the books, and the Giants are 1-0. Next up: a home game vs. the Cincinnati Reds on Sunday, at 12:05 p.m. PT.