The Marlins didn't disclose financial terms but sources told ESPN.com that Morse will earn $16 million in the deal.
Morse can earn more in the contract through performance bonuses.
The 32-year-old outfielder/first baseman hit .279 with 16 home runs and 61 RBIs for the World Series champion San Francisco Giants last season, his first with the team. He hit .250 with four RBIs in 16 at-bats in the World Series.
He was paid $6 million in 2014.
Morse is the latest addition this offseason for the Marlins, who have made a flurry of moves after locking up slugger Giancarlo Stanton to a record $325 million contract. They also traded for All-Star second baseman Dee Gordon, right-hander Mat Latos and right-hander Dan Haren, who has indicated he might retire.
ESPN.com's Jerry Crasnick and The Associated Press contributed to this report.