Git push nie powiódł się, „Odrzucono aktualizacje bez szybkiego przewijania do przodu”

99

Edytowałem moje repozytoria GIT za pośrednictwem Git Online. Po próbie wypchnięcia zmian w kodzie lokalnym pojawił się błąd:

Git push failed, To prevent from losing history, non-fast forward updates were rejected.

Jak mogę to naprawić?

Sarath
źródło

Odpowiedzi:

137

Najpierw ściągnij zmiany:

git pull origin branch_name
iafonov
źródło
1
Jeśli to nie rozwiąże Twojego problemu, upewnij się, że pchasz do tej samej gałęzi, nad którą aktualnie pracujesz. Sprawdź, w której gałęzi jesteś ze statusem git.
afilina
1
To polecenie zadziałało, ale chciałbym wiedzieć, dlaczego nie git pull:? Pilot jest równa origin, więc to rzeczywiście działa: git pull origin. Czy nie powinien zaktualizować wszystkich oddziałów?
Karlen Kishmiryan
83

Dodaj --force do swojego wiersza poleceń, jeśli jesteś pewien, że chcesz wcisnąć. Np. Użyj git push origin --force(polecam linię poleceń, ponieważ znajdziesz znacznie więcej wsparcia od innych użytkowników z linią poleceń. Również może to nie być możliwe w przypadku SmartGit.) Więcej informacji znajdziesz na tej stronie: http://help.github.com/ piloty /

Matt
źródło
8
- siła rozwiąże twoje problemy, ale potencjalnie zaszkodzi innym. Powinien być używany tylko z dużą ostrożnością (i wiedzą)
schoetbi
7
-1, ponieważ generalnie wymuszanie pchnięć jest okropnym pomysłem.
joshin4colours
6
+1, ponieważ 5 osób zgodziło się z @ joshin4colours dać -1. Ale podczas gdy pchanie siłowe nie zawsze jest najlepszym pomysłem (co git wyjaśnia całkiem jasno, zaprzeczając twojemu pchnięciu), gdyby był to zły pomysł w 100% przypadków, opcja nie istniałaby. Sugestia Matta z pewnością może być przydatna dla innych.
user1271772
2
--forceJeśli jesteś jedyną osobą korzystającą z tej gałęzi, możesz skorzystać z niej . Jednak powoduje problemy podczas udostępniania gałęzi innym programistom.
Robert Brisita
22

Przed wypchnięciem wykonaj polecenie git pull z opcją rebase. Spowoduje to pobranie zmian, które wprowadziłeś online (w swoim źródle) i zastosowanie ich lokalnie, a następnie dodanie lokalnych zmian.

git pull --rebase

Teraz możesz przejść do zdalnego

git push 

Aby uzyskać więcej informacji, zapoznaj się z omówieniem rebase Git i rozdziałem 3.6 Rozgałęzienie Git - Rebasing .

satishgoda
źródło
2
W moim przypadku git pull --rebasekończy sięThere is no tracking information for the current branch. Please specify which branch you want to rebase against.
trejder
17

Napotkałem ten sam błąd, po prostu dodaj „--force” do polecenia, działa

git push origin master --force
Wen Qi
źródło
6
czy ma to konsekwencje?
jayunit100
8
utrata zobowiązań innych.
Giovanni Toraldo
1
Miałem dziwną sytuację, w której właśnie to chciałem zrobić ... zdmuchnąć zawartość właśnie utworzonej zdalnej gałęzi master za pomocą czegoś nowego. To rozwiązało mój problem. Chociaż nie jest to rozwiązanie dla wszystkich, --forcemoże być pomocne.
Brad
1
Nie sądzę, aby ta odpowiedź zasługiwała na głosowanie negatywne 6 razy. Jest to poprawne rozwiązanie podanego problemu, jednak autor mógł być nieco bardziej opisowy, jeśli chodzi o okoliczności, w których to polecenie byłoby przydatne. Jeśli warto o tym wspomnieć, bo warto było pisać (funkcjonalność dla --force)
Aiden Strydom
5

Miałem ten sam problem.
Powodem było to, że mój lokalny oddział w jakiś sposób stracił śledzenie do zdalnego odpowiednika.

Po

git branch branch_name --set-upstream-to=origin/branch_name
git pull

i rozwiązując łączące się konflikty, mogłem naciskać.

twarda
źródło
Wygląda na to, że przegapiłeś zmiany w oddziale zdalnym
ozma
5

Możesz dodać --force-with-lease do polecenia, będzie działać.

git push --force-with-lease

--force jest destrukcyjny, ponieważ bezwarunkowo nadpisuje zdalne repozytorium tym, co masz lokalnie. Ale --force-with-lease zapewnia, że ​​nie nadpisujesz pracy innych osób.

Zobacz więcej informacji tutaj .

igorjosesantos
źródło
1

(Jedno) rozwiązanie dla Netbeans 7.1: Spróbuj wyciągnąć. To prawdopodobnie również się nie powiedzie. Teraz spójrz na dzienniki (zwykle są one teraz wyświetlane w IDE). Jest jeden lub więcej wersów:

„Pobieranie nie powiodło się z powodu tego pliku:”

Przeszukaj ten plik, usuń go (wcześniej wykonaj kopię zapasową). Zwykle jest to plik .gitignore, więc nie usuniesz kodu. Ponów pchnięcie. Teraz wszystko powinno działać dobrze.

Sliq
źródło
1

Korzystanie z --rebaseopcji zadziałało dla mnie.

  • git pull <remote> <branch> --rebase

Następnie przejdź do repozytorium.

  • git push <remote> <branch>

Na przykład

git pull origin master --rebase

git push origin master

CyberDemic
źródło
0

Mam ten sam problem. Rozwiązałem z

git checkout <name branch>
git pull origin <name branch>
git push origin <name branch>
Andrea Perdicchia
źródło
3
OP mówi o wprowadzaniu lokalnych zmian w kodzie. checkoutnadpisze te zmiany lub przynajmniej nie uwzględni ich w trybie push.
trejder
0

To właśnie zadziałało dla mnie. Można go znaleźć w dokumentacji git tutaj

Jeśli jesteś w wybranym oddziale, możesz to zrobić:

git fetch origin
# Fetches updates made to an online repository
git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work
CodeChops
źródło
0

Napotkał ten sam problem, aby go rozwiązać, uruchom następujące gitpolecenia.

  • git pull {url} --rebase
  • git push --set-upstream {url} master

Najpierw musisz utworzyć repozytorium na githubie.

blackFoxCoder
źródło
0

Czasami, gdy pociągasz za tyłek, GŁOWA odłącza się. Możesz to sprawdzić wpisując polecenie:

git branch 
  • (GŁOWA odłączona od 8790704)

    mistrz

    rozwijać się

Lepiej jest przenieść się do swojej gałęzi i ponownie wyciągnąć rękę z odpowiedniego oddziału.

git checkout develop

git pull origin develop

git push origin develop
Abhinav
źródło