Можно ли сделать коммит между старыми двумя коммитами?
 могу я впихнуть например коммит D между коммитами А и B? чтобы получилось так:
Можешь, с помощью git rebase. Сложность впихивания напрямую зависит от того, насколько много общих строчек изменяют D, B и C. Если они полностью независимы, git rebase сделает всё сам, если нет -- прийдётся разрешать конфликты.
Только если перебазировать или черри-пикнуть коммиты B и C относительно коммита D. Само собой, они перестанут быть прежними коммитами и будут новыми с новыми хэшами.