Вы видите функцию безопасности 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
.