Jak scalić zdalne zmiany w GitHub?


137

Otrzymuję następujący błąd podczas pierwszej próby wypychania na Github:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

jak mogę to naprawić i scalić zdalne zmiany?

Odpowiedzi:


106

Zobacz sekcję „non-fast forward” w „ git push --help ” po szczegóły.

Możesz wykonać „git pull”, rozwiązać potencjalne konflikty i „git push” wynik. „Git pull” utworzy scalające zatwierdzenie C między zatwierdzeniami A i B.

Alternatywnie, możesz zmienić swoją zmianę między X i B na górze A, używając „git pull --rebase” i odepchnąć wynik z powrotem. Rebase utworzy nowe zatwierdzenie D, które buduje zmianę między X i B nad A.


16
Ciągle wpadam na to, z wyjątkiem tego, że jeśli zrobię „git pull”, powiedzą mi „już aktualne”. a jeśli wykonam polecenie „git pull --rebase”, otrzymuję informację, że „aktualny wzorzec gałęzi jest aktualny”. Jakieś pomysły? Dzięki!
jwl

3
@ larson4 Mam ten sam problem, ale po git pullwykonaniu kolejnego commita, a potem powinno być dobrze
Patrick

20
@Patrick @larson Miałem podobny problem spowodowany tym, że nie przeczytałem dokładnie komunikatu o błędzie. Odrzucenie było na gałęzi, której nie sprawdziłem. Gałąź, w której się znajdowałem, odniosła sukces. Rozwiązaniem było git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Noah Spurrier

86

Możesz także wymusić wypchnięcie, dodając symbol + przed nazwą swojej gałęzi.

git push origin +some_branch

1
Dziękuję, ten działa dla mnie. Inne rozwiązania całkowicie wymazałyby efekt mojegogit reset --hard
Oli

1
Dzięki! Przeniosłem gałąź „A” do mojej aplikacji testowej Heroku, aby przetestować niektóre funkcje w środowisku produkcyjnym. Następnie (lokalnie) połączyłem „A” i „B” w „master” i chciałem wypchnąć „master” do mojej aplikacji. Miałem różnego rodzaju problemy. To sprawiło, że popychanie „mistrza” było bardzo proste. Dzięki!
Don Leatham

Dla mnie też zadziałał. Znalezienie problemu zajęło mi 4 godziny. Wielkie dzięki. Uruchamiam Netbeans na komputerze lokalnym (Windows 7) i chciałem przy każdym naciśnięciu na lokalnym, sprawdzeniu na zdalnym komputerze (linux).
Maxim Shoustin

Zauważ, że ta metoda może nie być bezpieczna i może spowodować, że niektóre rozbieżne zatwierdzenia staną się nieosiągalne.
samuil

To powinno być przyjęte rozwiązanie. Inne rozwiązania nie działały u mnie
banarun

20

Prawdopodobnie masz zmiany na githubie, których nigdy nie scaliłeś. Spróbuj git pullpobrać i scalić zmiany, wtedy powinieneś być w stanie push. Przepraszam, jeśli źle zrozumiałem Twoje pytanie.


18
W przypadku, gdy musisz odrzucić zmiany w zdalnym serwerze głównym i wprowadzić własne zmiany, spróbuj nacisnąć klawisz -f
Hotsyk

13

Jeśli zobaczysz komunikat „git pull” i zobaczysz komunikat „Już aktualny”, a nadal otrzymujesz ten błąd, może to być spowodowane tym, że jedna z pozostałych gałęzi nie jest aktualna. Spróbuj przełączyć się na inną gałąź i upewnij się, że jest ona również aktualna, zanim spróbujesz ponownie „git push”:

Przełącz się na gałąź „foo” i zaktualizuj ją:

$ git checkout foo
$ git pull

Możesz zobaczyć posiadane gałęzie, wydając polecenie:

$ git branch

Czy możesz wyjaśnić, dlaczego to działa i jest konieczne? (To rozwiązało mój problem.) Po prostu wydaje mi się to sprzeczne z intuicją. Nie rozumiem, dlaczego git miałby potrzebować innej gałęzi, aby była aktualna, abym mógł naciskać na gałąź główną.
Quinxy von Besiex

@QuinxyvonBesiex Nie jestem pewien, czy sam rozumiem. Może to mieć coś wspólnego z podstawową strukturą samego Gita i sposobem, w jaki organizuje gałęzie (które są w zasadzie takie same jak znaczniki, o ile rozumiem).
David Calhoun

7

Możesz zmusić go do pchania, ale rób to TYLKO wtedy, gdy jesteś całkiem pewien, co robisz.

Polecenie to:

git push -f 

3

Ten problem może również wystąpić, gdy masz sprzeczne tagi. Jeśli twoja lokalna i zdalna wersja używają tej samej nazwy tagu dla różnych zatwierdzeń, możesz skończyć tutaj.

Możesz rozwiązać ten problem, usuwając lokalny tag:

$ git tag --delete foo_tag

2

Kiedy pojawił się ten błąd, utworzyłem kopię zapasową całego folderu projektu. Potem zrobiłem coś takiego

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... w zależności od nazwy twojego oddziału (jeśli nie jest to master).

Wtedy zrobiłem git pull --rebase. Następnie zastąpiłem pobrane pliki plikami z kopii zapasowej projektu. Teraz jestem gotowy, aby ponownie zatwierdzić zmiany i naciskać.


0

1) Wymuszanie ściągnięcia w celu nadpisania lokalnych zmian

Jeśli nie dbasz o zmiany dokonane lokalnie i chcesz uzyskać kod z repozytorium, możesz wymusić ściągnięcie. Spowoduje to nadpisanie wszystkich lokalnych zmian dokonanych na komputerze i pojawi się zduplikowana kopia wersji w repozytorium.

Wykonaj następujące polecenia w swoim IDE:

reset git - twardy

git pull

Spowoduje to natychmiastowe zniszczenie wszystkich lokalnych zmian, więc upewnij się, że wiesz, co robisz i nie potrzebujesz zmian lokalnych.

2) Zachowanie obu zmian (lokalnych i z repozytorium)

Jeśli chcesz zachować obie zmiany (zmiany dokonane lokalnie i zmiany obecne w repozytorium), możesz dodać i zatwierdzić swoje zmiany. Kiedy pociągniesz, oczywiście nastąpi konflikt scalania. Tutaj możesz użyć narzędzi w swoim IDE (takich jak Difftool i Mergetool), aby porównać dwa fragmenty kodu i określić, które zmiany zachować, a które usunąć. To jest środkowa droga; żadne zmiany nie zostaną utracone, dopóki nie usuniesz ich ręcznie.

git dodaj $ the_file_under_error

git commit

git pull
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.