Расширяя подход @ jthill, я бы сделал
git merge --no-commit --no-ff trunk
git diff --name-only -z --diff-filter=A @ | xargs -0 git rm -f
rm .git/MERGE_*
git commit
Это заставило бы git забыть, что выполняется слияние, и не позволит удалить файлы, когда вы, наконец, захотите слить обратно в свой ствол.
В качестве комментария, однако, это не очень устойчивый рабочий процесс, даже если вы пишете свой собственный скрипт, чтобы автоматически делать это каждый раз. Стоит задать вопрос, почему вы чувствуете, что должны это сделать.
Возможно, что: - репо слишком велико - тогда вы должны подумать о разделении кода - ваша работа логически разделена - тогда вам непременно стоит подумать о разделении кода - там сломано работать в транке - тогда вы должны внедрить новый рабочий процесс, который не объединит сломанный код в транк
Альтернативные решения, если вы не хотите изменять свой рабочий процесс, будут:
Если Вы хотите полностью перезаписать изменения
git checkout trunk -- *
git commit
Если вы хотите полностью перезаписать некоторые файлы
git checkout trunk -- file2
git commit
Или, интерактивная перебазировка дает вам возможность выбрать только те коммиты, которые вы хотите. Это также не приведет к удалению файлов позже
git rebase -i trunk
Лично я бы посмотрел на изменение вашего рабочего процесса. Если у вас есть дополнительная информация о вашей ситуации, мы сможем помочь вам найти другие решения.