Это может быть не просто. Оцените необходимость этой операции прежде чем действовать, можно сильно навредить репозиторию / коду.
Задачу можно выполнить через интерактивный rebase. В процессе с высокой вероятностью возникнут конфликты. Я бы делал в 2 этапа. Первым делом расположил бы коммиты в нужном порядке
git rebase -i хеш_коммита_3^
В открывшемся редакторе можно выставить коммиты в нужном порядке.
После сохранения файла, вероятнее всего появится сообщение о неразрешенных конфликтах - их все необходмио разрешить, добавить в индекс и продолжить rebase через git rebase --continue
После успеха, можно повторить интерактивный rebase с целью сделать squash.
Я делал так. Сказал себе "Хочу написать клиент-сервер, который передает изображение рабочего стола одного компьютера на другой" и побежал в гугл, а оттуда на киберфорум, стэковерфлоу и.т.п. И написал, попутно разбираюсь как реализовать ту функцию или ту. А что будет если я сделаю не как в примере, а вот так ну и тому подобное. Потом сказал "Хочу написать автоапдейтер резюме на hh.ru" ну и алгоритм описан выше :)
Мне просто было это интересно, и это мотивировало разбираться с языком для решения моей задачи. Тестовые задания я не осилил делать в силу лени и не интересности. Хотя подход в целом можно назвать корявым.)