Я нашел достойное решение.Выполнение этих двух команд восстановит все изменения в коммите, не удаляя коммит.
git diff-tree -no-commit-id --name-status -r HEAD | grep -oP '(?<=A).*' | xargs git rm
git diff-tree -no-commit-id --name-status -r HEAD | grep -oP '(?<=M).*' | xargs git checkout HEAD~1
В первой строке удаляются все добавленные файлы ивторая строка восстанавливает изменения, внесенные в уже существующие файлы.
Первая команда git diff-tree
возвращает изменения в коммите, опция --no-commit-id
удаляет идентификатор, а --name-status
возвращает только имя файлов исимвол, который указывает, является ли это новый файл, измененный или удаленный файл.Результат передается в команду grep, которая ищет A или M (добавленные или измененные файлы) и возвращает строку, исключающую этот символ.Наконец, xargs преобразует вывод в аргументы, а затем я выполняю необходимую команду git для файлов, git rm
для добавленных файлов и git checkout HEAD~1
для измененных файлов.