Я случайно фиксировал log/test.log, но никогда не продвигал его. Я с тех пор сделал комнату мерзавца для избавлений от него. Но когда я пытаюсь продвинуть, я все еще получаю огромный объем данных, пытающийся быть переданным. Не был должен комната мерзавца решать ту проблему. В противном случае, как я мог зафиксировать его?
Не отменяйте фиксацию и не нажимайте, потому что огромный файл все равно будет сохраняться в истории.
Учитывая, что вы еще не нажали его и что коммит, который вы хотите повторить, является самым последним, удалите этот коммит из своей истории:
$ git reset HEAD^
Это вернет ваш индекс в то состояние, в котором он находился в родительском коммите ( ГОЛОВА ^
). Теперь у вас есть пересдача: добавьте и зафиксируйте так, как вы хотели в первый раз.
Если вы сделали другие последующие коммиты, вам потребуется git rebase -i
, где
- это 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
Если вы еще не нажали, вы можете использовать git rebase -i
, чтобы отредактировать историю коммитов, удалив как добавьте
и rm
. Единственное предостережение: вы должны быть осторожны, чтобы не редактировать какие-либо коммиты, которые уже были отправлены.
http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive
Вы спросили, можете ли вы еще сделать это, если есть другие изменения в коммите и другие коммиты, следующие за этим. По-разному. У вас должна быть возможность редактировать / удалять любую не отправленную фиксацию, а не только самую последнюю. Но перебазирование может завершиться неудачно, если последующие изменения сильно зависят от изменений в удаленной фиксации (например, вы добавили файл, а затем отредактировали его в более поздней фиксации). Если вы удалите фиксацию, вы потеряете все изменения в этой фиксации. Я не знаю, как удалить одно изменение из фиксации. Если вы не хотите потерять другие изменения в тесте.rb commit, вы можете сгенерировать патч (с помощью git show
или со встроенными функциями git patch
) перед удалением фиксации. Затем отредактируйте файл патча, чтобы удалить большой test.rb, но оставьте желаемые изменения и повторно примените патч к голове.
Если у вас есть проблема, о которой я упоминал ранее, когда происходит сбой перезагрузки (или вы думаете, что она не удалась), вы можете сохранить исправления для всех ваших коммитов после фиксации проблемы, удалить их все и повторно применить. чтобы.