git revert -n <hash of bulk commit>
попытается отменить изменения в массовом коммите в вашем рабочем дереве. Как только это будет сделано, вы можете запустить git reset HEAD -- <paths to keep changes in>
, возможно, с --patch
(для интерактивного выбора сохраняемых изменений). Затем вы делаете это, как и любой другой.
Является ли ваш репозиторий приватным / не выдвинутым? Если так, у вас есть еще один вариант, хотя я не советую его для чего-то подобного. git rebase -i <hash of commit before bulk>
. Отредактируйте первую строку (должна иметь первую строку массовой фиксации), чтобы начать с e
или edit
.
В этот момент вы можете использовать git reset <hash of commit before bulk> -- <paths to revert>
, а затем git commit --amend
, чтобы исправить ваш объемный коммит, чтобы исключить изменения в некоторых файлах. Затем git rebase --continue
перепишет всю оставшуюся историю поверх скорректированного коммита; вам, возможно, придется разрешать конфликты и продолжать снова, если они касаются обращенных битов файлов. После этого ваша история будет выглядеть так, будто вы никогда не вносили некоторые плохие изменения; для частного проекта это может быть хорошо, но просто имейте в виду, что после перебазирования становится довольно трудно вернуться к любому из промежуточных состояний, из которых вы переписываете. Вы можете сделать это с git reflog
на некоторое время, но со временем старые версии коммитов истекают и удаляются из хранилища.
В любом случае, я бы посоветовал использовать git diff --name-only
и некоторое редактирование, чтобы собрать вместе пути, содержащие список текстовых файлов, изменения которых вы хотите / не хотите отменять, а затем использовать конструкцию оболочки, такую как $(< badfiles)
в места, где я говорю об использовании списков путей в командной строке для извлечения этого файла. Один на строку или разделенный пробелами будет хорошо работать для такого рода вещей. Да, и если у вас есть пробелы в ваших путях, вам нужно поместить кавычки вокруг путей в файле, чтобы он работал.