Главная Категории Контакты Поиск

Как обновить удаленный репозиторий после выполнения git rebase

Узнай как использовать `-f` и `--force-with-lease` и переписать историю коммитов в удаленном репозитории.

Git·11.07.2019·читать 1 мин 🤓·Автор: Alexey Myzgin

Когда мы обновляем локальную 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

Теперь мы переопределили нашу удалённую копию.

Website, name & logo
Copyright © 2022. Alex Myzgin