Is that deadlock related to the remote server or local server? being that you are updating the local server I would expect it to be related to local resources, not remote ones.
But in any case first thing I would look at is to see if there is a field on the source table that can be used to identify if the record has been changed since last time the data was copied - something like a created date and modified date.
If this is available use that to reduce the number of rows to retrieve.
now regarding the process.
As far as my experience goes on that type of situation the merge is being split by the engine into 2 steps
step 1 - execute the select query on the remote server and insert into a local temp table
step 2 - merge the temp table with the local table.
This still being the case you might be better off splitting the merge into the same 2 steps explicitly where you will have better control over how the query is executed on the source, and at what point the local resource is used.
In this situation it may even be better to do a initial join to the local table to identify the changed records and put these on a temporary table before doing the merge as there are situations where a set of insert/delete/update steps is faster than a single merge even if it requires more coding.