Когда мы обновляем локальную feature ветку с помощью git rebase
, мы переписываем историю. Таким образом, при попытке обновить свою удаленную ветку с помощью git push
запрос будет отклонен. В таком случае, может помочь --force
и --force-with-lease
для принудительного обновления удаленной ветки.
Поскольку мы используем rebase
, мы на самом деле переписываем историю, как упоминалось ранее в статье Как обновить свою ветку последними изменениями с основной ветки. Есть один странный побочный эффект, с которым можно столкнуться. После того как мы сделаем git rebase
в нашей ветке и попытаемся синхронизировать её с помощью git push
, то получим сообщение о том, что оно было отклонено.
! [rejected] имя_ветки -> имя_ветки (non-fast-forward)
error: не удалось отправить некоторые ссылки в «https://github.com/имя_репозитория»
подсказка: Обновления были отклонены, так как верхушка вашей текущей ветки
подсказка: позади ее внешней части. Заберите и слейте внешние изменения
подсказка: (например, с помощью «git pull …») перед повторной попыткой отправки
подсказка: изменений.
подсказка: Для дополнительной информации, смотрите «Note about fast-forwards»
подсказка: в «git push --help».
Причина, по которой он был отклонен, заключалась в том, что HEAD нашей текущей ветки находится позади удаленной версии, что может показаться странным, потому что мы фактически добавили новые изменения.
Причина в том, что мы переписали эти комментарии. Git их больше не распознает, и поэтому мы должны синхронизироваться обратно, чтобы изменить результат в удаленном репозитории. Однако, нам это не нужно. На самом деле мы хотим переопределить нашу удалённую копию, так как мы знаем, что наша локальная ветка обновлена.
Используем git push -f
, который переопределяет ветку удаленного репозитория, в которую в настоящий момент отправляем изменения.
Важно помнить - это нужно делать не на ветке master
, а только на своей feature ветке, и делать это только в том случае, если она на самом деле является нашей личной, и ею никто не делится.
Кроме того, можно добавить --force-with-lease
, который более безопасен, так как выполняет некоторые дополнительные проверки. Будучи на ветке разработки делаем:
git push --force-with-lease
Теперь мы переопределили нашу удалённую копию.