Правильный ответ - учесть тот факт, что у D есть 2 родителя на выходе, который вы хотите. Я собираюсь предположить, что хозяин указывает на Е.
git branch new-branch C
git checkout -b merge-base B
git merge --no-ff new-branch
git rebase --onto merge-base D^ master
git checkout master
В итоге вы получите:
C
/ \
A--B---Y--D'--E'
это сохранит C как родителя при слиянии с основной веткой. Вы можете раздавить D в Y с помощью git rebase -i head ^^^. Вы бы тогда имели:
C
/ \
A--B---D''--E''