I haven't tested this, but this might do what you want:
git checkout master
git merge -s recursive -X theirs branch-c
git merge -s recursive -X theirs branch-a
git merge -s recursive -X theirs branch-b
This is using the recursive
merge strategy, but saying that if there are any conflicts when merging, to always resolve them in favour of the branch you're merging into your current branch. To find the documentation for this, look at the section on the recursive merge strategy in the git merge man page, and the ours
and theirs
options to that strategy.
The problem with this is that if the changes you've made to the files in each branch don't conflict, you'll have some of the changes from one branch and one in the other. If that's not what you want (and I concede that I don't quite understand your workflow in the first place) you might have to do, for example:
git merge --no-commit branch-c
... and then update the index with each file version that you want manually before committing that merge commit. After running that command, you could find all the files which are present on both branches with:
comm -1 -2 <(git ls-tree -r --name-only master|sort) <(git ls-tree -r --name-only branch-c|sort) > common.txt
... and then pick the branch-c
version for each one with:
xargs -n 1 git checkout branch-c -- < common.txt
... and then committing with git commit
as usual.
Just to reiterate, I'm pretty sure I'd never want to do this - git's default merge behaviour almost always does what I want, only leaving genuine conflicts to resolve.