Interior Minister Thomas de Maiziere defended the law, which passed by a margin of 376 against 298, as “a compromise between humanity and responsibility… between generosity and realism”.
The measure was agreed Tuesday in ongoing coalition talks between Chancellor Angela Merkel's conservative camp and the Social Democrats, in the hope of launching a new joint government by late March.
Germany, which has taken in more than a million asylum seekers since 2015, stopped family reunions for such “subsidiary” status refugees in March 2016 to slow the mass influx.
Those with subsidiary status are not considered political or war refugees, but are temporarily spared deportation on safety grounds.
An increasingly heated debate on immigration has pitted left-leaning parties and pro-refugee groups against conservatives and the far-right, anti-Islam Alternative for Germany (AfD) party.
AfD lawmaker Christian Wirth argued that refugees should reunite with their families back in their home countries, for example in what he called “protected zones in Syria”.
He also charged that “Merkel's 2015 decision to allow German borders to be overrun by a migrant flood… was a flagrant breach of the law” and accused her government and the EU of a plot to replace Europe's population with Arabs and Africans.
The issue of how many subsidiary-status refugees are allowed to bring their spouses or children had become one of the most contentious in the coalition talks.
Merkel's conservatives and the Social Democrats also agreed in principle to cap Germany's total annual intake at about 200,000 asylum seekers a year.
Under the new law, family reunions will remain suspended until the end of July, after which up to 1,000 relatives a month, plus an unknown number of yet to be defined “hardship cases”, will be allowed to come to Germany.
The refugee aid group Pro Asyl slammed the law as “absolutely insufficient” and a victory for the “hardliners” in Merkel's Bavarian sister party the CSU.
The Greens party accused the Social Democrats of caving on the issue, while the parliamentary head of the far-left Die Linke party Dietmar Bartsch charged that “this law is arbitrary, morally questionable and inhumane”.