Ви бачите функцію безпеки 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
має null local_ref, що означає натиснути нульову гілку на віддалену сторону master
, тобто видалити віддалену гілку. Ім'я гілки без жодного :
способу натискати локальну гілку з вказаним іменем до віддаленої гілки з тим самим іменем. master
в цій ситуації коротко master:master
.