Co oznacza „odrzucono aktualizacje Git push non-fast-forward”?

153

Używam Git do zarządzania moimi dwoma komputerami i rozwojem. Próbuję zatwierdzić zmiany w GitHub i otrzymuję błąd.

Nie udało się odesłać niektórych referencji <repo>. Aby zapobiec utracie historii, odrzucono aktualizacje bez szybkiego przewijania do przodu. Scal zdalne zmiany przed ponownym naciśnięciem.

Co może być tego przyczyną i jak mogę to naprawić?

EDYTOWAĆ:

Wyciągnięcie repozytorium zwraca następujące dane:

* gałąź główna -> główna (bez przewijania do przodu) Już aktualna

Pchanie nadal powoduje wspomniany błąd.

Mosze
źródło

Odpowiedzi:

136

GitHub ma fajną sekcję o nazwie „ Radzenie sobie z błędaminiezwiązanymi z przewijaniem do przodu ”

Ten błąd może na początku być nieco przytłaczający, nie bój się.
Mówiąc najprościej, git nie może dokonać zmiany na pilocie bez utraty zatwierdzeń, więc odmawia .
Zwykle jest to spowodowane przez innego użytkownika pchającego do tej samej gałęzi. Możesz temu zaradzić, pobierając i scalając zdalną gałąź lub używając ściągania, aby wykonać oba naraz.

W innych przypadkach ten błąd jest wynikiem destrukcyjnych zmian wprowadzonych lokalnie za pomocą poleceń takich jak git commit --amendlub git rebase.
Chociaż możesz nadpisać pilota, dodając --forcedo pushpolecenia, powinieneś to zrobić tylko wtedy, gdy masz absolutną pewność, że chcesz to zrobić.
Wymuszenie wypychania może powodować problemy dla innych użytkowników, którzy pobrali zdalną gałąź, i jest uważane za złą praktykę. W razie wątpliwości nie naciskaj na siłę .


Git nie może wprowadzać zmian na pilocie, takich jak szybkie scalanie do przodu, co ilustruje Visual Git Reference :

tekst alternatywny

Nie jest to dokładnie twój przypadek, ale pomaga zobaczyć, czym jest „przewijanie do przodu” (gdzie HEADgałąź jest po prostu przenoszona do nowego, nowszego zatwierdzenia).


Znak „ branch master->master (non-fast-forward) Already-up-to-date” jest zwykle przeznaczony dla lokalnych oddziałów, które nie śledzą swoich zdalnych odpowiedników.
Zobacz na przykład to pytanie SO " git pull mówi, że jest aktualny, ale git push odrzuca non-fast forward ".
Albo te dwie gałęzie są połączone, ale nie zgadzają się z ich historią:
Zobacz „ Niekończąca się historia GIT - co ja tu robię źle?

Oznacza to, że twoja gałąź subversion i zdalna gałąź git master nie zgadzają się na coś.
Pewna zmiana została wprowadzona / zatwierdzona do jednej, której nie ma w drugiej.
Odpal gitk --all, a to powinno dać ci wskazówkę, co poszło nie tak - poszukaj „rozwidleń” w historii.

VonC
źródło
53

Oznacza to, że do zdalnego repozytorium zostały wysłane inne zatwierdzenia, które różnią się od twoich zatwierdzeń. Zwykle można to rozwiązać za pomocą pliku

git pull

zanim pchniesz

Ostatecznie „przewijanie do przodu” oznacza, że ​​zatwierdzenia można zastosować bezpośrednio na szczycie drzewa roboczego bez konieczności łączenia.

minichate
źródło
2
To właśnie zadziałało dla mnie! Zapomniałem, że zmieniłem plik readme.md na stronie repozytorium!
ryanwinchester
14

Szybka aktualizacja polega na tym, że jedyne zmiany po jednej stronie następują po ostatnim zatwierdzeniu po drugiej stronie, więc nie ma potrzeby łączenia. Oznacza to, że musisz scalić zmiany, zanim będziesz mógł push.

bdukes
źródło
8

w takim przypadku możesz użyć siły z operacją wypychania

git push origin master --force

uspinar
źródło
1
To jest źle. całkowite źródło github zostanie usunięte i wypchnięte tylko ty nowe źródło stare źródło zostanie usunięte
logeshpalani98
6

Nigdy nie rób git -ftego, pushponieważ może to spowodować później katastrofalne konsekwencje.

Musisz tylko zrobić git pullz lokalnego oddziału.

Dawny:

git pull origin 'your_local_branch'

a następnie zrób git push

Abhishek Thomas
źródło
0

Musisz scalić i rozwiązać problem conflicts locallyprzed wprowadzeniem zmian do zdalnego repo / forka.

1) ściągnij (pobierz i połącz)

$ git pull remote branch 

2) Wprowadź zmiany

$ git push remote branch 

Nadal masz szybki wybór, aby pushwymusić użycie --forceopcji, ale należy tego unikać, ponieważ może to spowodować utratę zmian lub niekorzystny wpływ na innych współtwórców.

Muhammad Soliman
źródło