Не отменяйте фиксацию и не нажимайте, потому что огромный файл все еще будет храниться в истории.
Учитывая, что вы еще не выдвинули его и что коммит, который вы хотите повторить, является самым последним, удалите этот коммит из своей истории:
$ git reset HEAD^
Это вернет ваш индекс в состояние, в котором он находился в родительском коммите (HEAD^
). Теперь у вас есть Маллиган: добавьте и зафиксируйте то, что вы имели в виду в первый раз.
Если вы сделали другие последующие коммиты, вам нужно будет git rebase -i <commit>
, где <commit>
- SHA-1 родителя плохого коммита.
Например (и обратите внимание, что SHA-1 будет отличаться в вашем репо)
$ git rebase -i 57d0b28
откроет вам редактор, похожий на
pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
# Rebase 57d0b28..121802a onto 57d0b28
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Заменить pick
на edit
в строке с тяжелым коммитом
edit 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
Сохраните и выйдите из редактора, чтобы вернуться в оболочку, где вы увидите сообщение вида
Stopped at 366eca1... This has a huge file
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
Оттуда удалите поврежденный файл (--cached
удаляет файл только из индекса)
$ git rm --cached big-nasty-file
rm 'big-nasty-file'
изменить коммит
$ git commit --amend
и закончить ребаз
$ git rebase --continue