Git: синхронизация с удалённой веткой при отклонённом push
При отправке изменений может появиться такая ошибка:
git push
To https://github.com/datawhalechina/ai-hardware-robotics
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/datawhalechina/ai-hardware-robotics'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
- Ветка
mainна удалённом сервере новее, чем ваш локальныйorigin/main, поэтому push отклонён. Ваш локальный коммит нужно сначала объединить с новыми коммитами из удалённого репозитория (через merge или rebase). - Порядок действий:
git fetch origin: получаем последнее состояние удалённого репозитория.- (необязательно)
git log --oneline --graph --decorate origin/main..main: смотрим, чем ваши коммиты отличаются от удалённых. git pull --rebase origin main(или простоgit pull): интегрируем новые коммиты в локальную ветку. Если возникли конфликты, исправьте их, выполнитеgit add <файл>и затемgit rebase --continue.- Обычный
git push.
- Если вы используете
git pull(слияние по умолчанию), тоже подходит, но в истории появится дополнительный merge-коммит. - После завершения rebase или merge push пройдёт без отклонения.
Во время git pull Git создаёт merge-коммит и открывает редактор по умолчанию (в этом примере Vim) с текстом сообщения для слияния. Строка Merge branch 'main' of https://github.com/datawhalechina/ai-hardware-robotics — это стандартное сообщение, а строки с # — комментарии, которые при сохранении игнорируются.
- Чтобы принять сообщение по умолчанию, нажмите
Esc, введите:wqи нажмите Enter. Редактор закроется, Git создаст merge-коммит, иgit pullзавершится. - Если хотите избежать merge-коммита, после завершения или отмены текущей операции используйте
git pull --rebase origin main.