Widzisz funkcję bezpieczeństwa Git. Git nie chce zaktualizować gałęzi zdalnej za pomocą gałęzi, ponieważ zatwierdzenie główne gałęzi nie jest bezpośrednim potomkiem bieżącego zatwierdzenia głównego gałęzi, do której użytkownik naciska.
Gdyby tak nie było, dwie osoby pchające do tego samego repozytorium mniej więcej w tym samym czasie nie wiedziałyby, że nadchodzi nowy zatwierdzenie w tym samym czasie i ktokolwiek nacisnąłby ostatni, straciłby pracę poprzedniego popychacza bez żadnego z zdają sobie z tego sprawę.
Jeśli wiesz, że jesteś jedyną osobą, która pcha i chcesz wypchnąć zmienione zatwierdzenie lub wypchnąć zatwierdzenie, które wycofuje gałąź, możesz „zmusić” Gita do zaktualizowania zdalnej gałęzi za pomocą -f
przełącznika.
git push -f origin master
Nawet to może nie działać, ponieważ Git zezwala zdalnym repozytoriom na odrzucanie wypychania na drugim końcu za pomocą zmiennej konfiguracyjnej receive.denynonfastforwards
. W takim przypadku przyczyna odrzucenia będzie wyglądać następująco (zwróć uwagę na część „odrzucenie zdalne”):
! [remote rejected] master -> master (non-fast forward)
Aby obejść ten problem, musisz zmienić konfigurację zdalnego repozytorium lub jako brudny hack możesz usunąć i ponownie utworzyć gałąź w ten sposób:
git push origin :master
git push origin master
Zasadniczo ostatni parametr, który git push
korzysta z formatu <local_ref>:<remote_ref>
, gdzie local_ref
jest nazwą gałęzi w lokalnym repozytorium i remote_ref
nazwą gałęzi w zdalnym repozytorium. Ta para poleceń używa dwóch skrótów. :master
ma zerowy parametr local_ref, co oznacza wypchnięcie gałęzi null na stronę zdalną master
, tj. usunięcie gałęzi zdalnej. Nazwa oddziału w żadnym :
wypadku nie wypycha gałęzi lokalnej o podanej nazwie do oddziału zdalnego o tej samej nazwie. master
w tej sytuacji jest skrótem master:master
.