Garcia (3-3) surrendered two runs on six hits, walking just one while striking out three en route to the victory in a game that was delayed by rain for more than 2 hours in the sixth inning.
After play resumed, Jim Johnson tossed a 1-2-3 ninth for his 22nd save, securing a Baltimore win in the first of a three-game series.
The O's broke a 2-2 tie in the sixth when Nate McLouth singled, stole second, went to third on Manny Machado's single and scored when the ball rolled under Hamilton's glove in right field for an error.
Machado later provided a much-needed insurance run when he scored on Adam Jones sacrifice fly.
Jones also pounded a two-run homer in the victory.
Angels starter Jared Weaver (1-2) absorbed the loss, allowing four runs on six hits over 5 2/3 frames.
Hamilton socked a solo homer and provided a seventh-inning RBI for Los Angeles, which dropped a seventh in nine games.