Вы можете попробовать сделать "интерактивную перебазирование". «Rebase» обычно означает перемещение набора коммитов в другой базовый коммит, но в этом случае мы бы переместили коммиты в то же место в дереве, где они были, только используя «интерактивные» функции команды.
Скажите, что идентификатор фиксации для коммита, добавившего большие файлы, равен abc123
. Тогда вы запустите:
git rebase --interactive abc123^
(обратите внимание на конечную каретку: мы перебираемся на родителя этого коммита)
Это приведет вас к текстовому редактору, содержащему что-то вроде этого:
pick abc123 New garage, touch ups to lava 3
pick def456 ADded garage play, removed giant Tif file
[ ... and so on ... ]
В первой строке измените pick
на edit
, сохраните и выйдите. git rebase
теперь войдет в состояние, в котором этот коммит был поставлен, но еще не зафиксирован, и вы можете изменить коммит:
git rm --cached my-large-file.tiff my-other-large-file.tiff
Затем введите git rebase --continue
. Он создаст новый коммит с тем же сообщением коммита и тем же содержимым, что и у старого коммита, за исключением файлов большого размера. Затем он перебазирует все следующие коммиты поверх вновь созданного коммита.
Как только все это будет сделано, у вас будет новая ветвь без каких-либо следов больших файлов, готовая к слиянию в master
.