Вы видите функцию безопасности Git. Git отказывается обновлять удаленную ветку вашей веткой, потому что главная фиксация вашей ветви не является прямым потомком текущей главной ветки ветки, на которую вы отправляете ветку.
Если бы это было не так, то два человека, загружающие в один и тот же репозиторий примерно в одно и то же время, не знали бы, что в это же время поступает новый коммит, и тот, кто нажал последний, потеряет работу предыдущего толкателя. ни один из них не осознает этого.
Если вы знаете, что вы единственный, кто нажимает, и хотите отправить исправленный коммит или выдать коммит, который свернет ветку, вы можете «заставить» Git обновить удаленную ветку с помощью переключателя -f
.
git push -f origin master
Даже это может не сработать, так как Git позволяет удаленным репозиториям отклонять не-быстрые форсировки на дальнем конце, используя переменную конфигурации receive.denynonfastforwards
. В этом случае причина отказа будет выглядеть следующим образом (обратите внимание на часть «удаленный отказ»):
! [remote rejected] master -> master (non-fast forward)
Чтобы обойти это, вам нужно либо изменить конфигурацию удаленного репозитория, либо в качестве грязного хака вы можете удалить и воссоздать ветку таким образом:
git push origin :master
git push origin master
Как правило, последний параметр git push
использует формат <local_ref>:<remote_ref>
, где local_ref
- это имя ветви в локальном хранилище, а remote_ref
- имя ветви в удаленном хранилище. Эта пара команд использует два сокращения. :master
имеет нулевой local_ref, что означает перемещение нулевой ветви на удаленную сторону master
, т.е. удаление удаленной ветви. Имя ветви без :
означает передачу локальной ветви с заданным именем в удаленную ветку с тем же именем. master
в этой ситуации коротко для master:master
.