While the National League club didn't say how much it will pay the 25-year-old left-hander, several media outlets have pegged it at $27.5 million. Garcia is playing for $437,000 this season.
The new contract includes four guaranteed years plus two club options.
Garcia is 9-3 with a 3.22 earned run average this season after going 13-8 with a 2.70 ERA in 2010.
So far this season he has struck out 100 batters and walked 32 in 117 1/3 innings.
"Jaime is one the best young arms in baseball today," Cardinals General Manager John Mozeliak said. "We are excited to have him as part of the core of our pitching staff for years to come."
The Cardinals are tied with Milwaukee atop the NL Central Division.