Я не проверял это, но это может делать то, что вы хотите:
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
Это использует стратегию слияния recursive
, но говорит, что если при объединении возникают конфликты, всегдаразрешите их в пользу ветви, которую вы объединяете с текущей веткой.Чтобы найти документацию по этому вопросу, обратитесь к разделу о стратегии рекурсивного слияния на странице руководства git merge и опциям ours
и theirs
этой стратегии.
проблема заключается в том, что если изменения, внесенные в файлы в каждой ветви, не конфликтуют, у вас будут некоторые изменения из одной ветви и одной из другой.Если это не то, что вы хотите (и я признаю, что я не совсем понимаю ваш рабочий процесс в первую очередь), вам, возможно, придется сделать, например:
git merge --no-commit branch-c
... и затем обновить индексс каждой версией файла, которую вы хотите вручную, перед фиксацией.После выполнения этой команды вы можете найти все файлы, которые присутствуют в обеих ветвях, с помощью:
comm -1 -2 <(git ls-tree -r --name-only master|sort) <(git ls-tree -r --name-only branch-c|sort) > common.txt
... и затем выбрать версию branch-c
для каждого с помощью:
xargs -n 1 git checkout branch-c -- < common.txt
... а затем фиксируя с git commit
как обычно.
Просто повторюсь, я почти уверен, что я бы никогда не захотел сделать это - поведение слияния по умолчанию для gitпочти всегда делает то, что я хочу, оставляя только реальные конфликты для разрешения.