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