git: aktualizacje zostały odrzucone, ponieważ pilot zawiera pracę, której nie masz lokalnie

115

Pracuję w zespole z kilkoma programistami używającymi git na BitBucket. Wszyscy pracujemy nad devgałęzią, nie pchając się masteraż do wydania.

Jeden z programistów popełnił nieprawidłowy kod, który przez przypadek nadpisał mój własny, a teraz próbuję odesłać poprawny kod z powrotem do repozytorium. Od kilku dni czytam o tym błędzie, nie mogę już pushować do repozytorium, ponieważ pojawia się następujący błąd:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://[email protected]/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Postępuję zgodnie z instrukcjami i pull, ale wtedy pojawia się konflikt scalania. Po wpisaniu komunikatu o konflikcie scalania mój kod lokalny jest teraz nieprawidłowym kodem, który inny programista przesłał przez przypadek (zgodnie z oczekiwaniami pull). Więc zastępuję niepoprawny kod kopią zapasową, którą skopiowałem przed zatwierdzeniem, a kiedy próbuję ponownie wcisnąć, pojawia się ten sam błąd.

To naprawdę frustrujące, naprawdę chcę pomóc mojemu zespołowi i wnieść swój wkład, ale nie mogę z powodu tego błędu. Czy ktoś wie, jak rozwiązać ten problem? Byłbym bardzo wdzięczny za każdą pomoc.

Oto polecenia, które wykonuję, aby zatwierdzić, jeśli komuś to pomoże:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

Pomyślałbym, że jeśli zachowam tę kolejność, nie otrzymam konfliktów scalania. Chyba się myliłem. Dzięki jeszcze raz

Aktualizacja: dodam, że przez kilka godzin szukałem w Google i stackoverflow i postępowałem zgodnie z różnymi instrukcjami, ale nadal nie mogę pushdo devoddziału.

delos
źródło

Odpowiedzi:

42

git pull <remote> master:devpobierze remote/mastergałąź i połączy ją z twoją local/devgałęzią.

git pull <remote> devpobierze remote/devgałąź i połączy ją z bieżącą gałęzią.

Myślę, że powiedziałeś, że konfliktowe zatwierdzanie jest włączone remote/dev, więc jest to gałąź, którą prawdopodobnie zamierzałeś pobrać i scalić.

W takim przypadku tak naprawdę nie scalałeś konfliktu z lokalnym oddziałem, co jest trochę dziwne, ponieważ powiedziałeś, że widziałeś nieprawidłowy kod w kopii roboczej. Możesz chcieć sprawdzić, co się dzieje remote/master.

Jeff
źródło
1
Wow ... Nigdy tego nie wiedziałem. Ale teraz ma to duży sens. Gałąź główna również była niepoprawna, więc Twoja odpowiedź wyjaśnia całe moje pytanie. Wciąż jestem trochę nowy w git. Wielkie dzięki za powiedzenie mi różnicy między tymi dwoma!
delos
6
Najlepsza opcja dla mnie była git pull --rebase.
derekmx271
153

Użyj tego polecenia w terminalu

git push -f wzorzec pochodzenia

Donal
źródło
50
Używanie flagi push (-f) siły jest bardzo niebezpieczne i nigdy nie powinno być częścią twojego normalnego przepływu pracy
Spaideri
6
Negocjowane, ponieważ brakuje mi ostrzeżenia w tej odpowiedzi.
Melebius
3
Ooh! To zmusza repozytorium do przepisania samego siebie.
Azarsa
3
Miałem ten sam błąd z githubem i naprawiłem go za pomocą tego polecenia, @theeastcoastwest, dlaczego mówisz, że to niebezpieczne? jaki jest twój powód ”
simon
3
@simon jest to niebezpieczne, ponieważ ignoruje zdalną pracę i wymusza zmiany w repozytorium. Więc jeśli nie chcesz zepsuć pracy swojego zespołu, NIE naciskaj na siłę.
Gásten
43

Dzieje się tak, gdy próbujemy wypchnąć do zdalnego repozytorium, ale utworzyliśmy nowy plik na zdalnym, który nie został jeszcze ściągnięty, powiedzmy Readme. W takim razie jak mówi błąd

git odrzuca aktualizację

ponieważ nie pobraliśmy zaktualizowanego pilota w naszym środowisku lokalnym. Więc najpierw wyciągnij z pilota

git pull

Zaktualizuje lokalne repozytorium i doda nowy Readmeplik. Następnie wypchnij zaktualizowane zmiany do pilota

git push origin master
Himanshu
źródło
Robiłem to git pull origin developw mojej lokalnej branży deweloperskiej, ale teraz, po prostu git pullto działa dobrze, nie wiem dlaczego.
Alex
ponieważ domyślnie, jeśli twój lokalny oddział jest zsynchronizowany ze zdalnym oddziałem i jesteś wymeldowany w tym oddziale, nie musisz określać oddziału, po prostu git pullwystarczy
Himanshu
11

Zwykle dzieje się tak, gdy repozytorium zawiera elementy, których nie ma lokalnie. Aby więc wprowadzić nasze zmiany, w tym przypadku musimy zintegrować zdalne zmiany, a następnie nacisnąć.

Więc stwórz przyciąganie ze zdalnego

git pull origin master

Następnie wprowadź zmiany do tego pilota

git push origin master
Sravya
źródło
10

Siła do pchania

git push -f wzorzec pochodzenia

Samir Poudel
źródło
2
Powinno to prawdopodobnie oznaczać ostrzeżenie.
Chris
7

Naprawiłem to, nie jestem do końca pewien, co zrobiłem. Próbowałem po prostu pchać i ciągnąć za pomocą:

git pull <remote> dev zamiast git pull <remote> master:dev

Mam nadzieję, że to pomoże komuś, jeśli ma ten sam problem.

delos
źródło
6

Musisz wprowadzić:

$ git pull
$ git fetch 
$ git merge

Jeśli używasz git push origin master --force, będziesz miał duży problem.

gaoyehua
źródło
5
Dlaczego musisz używać git fetchi git mergeponownie ręcznie po uruchomieniu, git pullktóre je zawiera ?
Melebius
6

Możesz spróbować tego: git pull origin master --rebase

Eduardo Ramos
źródło
2
Cześć Eduardo! To zadziałało dla mnie. Ale czy możesz wyjaśnić, dlaczego to działa? Co dokładnie robi to polecenie?
Akshaya Natarajan
4

Cóż, w rzeczywistości github jest znacznie prostszy niż nam się wydaje i absolutnie dzieje się tak, gdy próbujemy push, nawet po jawnym wstawieniu niektórych plików do naszego repozytorium git, więc aby naprawić problem, po prostu spróbuj ...

: git pull

i wtedy..

: git push

Uwaga: jeśli przypadkowo utkniesz w edytorze vim po ściągnięciu repozytorium, nie martw się, po prostu zamknij edytor vim i spróbuj wypchnąć :)

d337
źródło
4

Wykonałem poniższe kroki. wreszcie działa dobrze.

Kroki

1) git init

2) status git (do sprawdzania statusu)

3) dodaj git. (dodaj cały plik zmian (.))

4) git commit -m "<pass your comment>"

5) zdalne dodać pochodzenie git "<pass your project clone url>"

6) git pull --allow-unrelated-histories "<pass your project clone url>"master

7) git push -u "<pass your project clone url>"master

Prabhat
źródło
2

Miałem ten błąd, a to dlatego, że na serwerze była aktualizacja, ale SourceTree nie pokazywał żadnych dostępnych aktualizacji (prawdopodobnie dlatego, że byłem offline, kiedy ostatnio sprawdzałem). Zrobiłem więc odświeżenie w drzewie źródłowym i teraz pokazuje 2 elementy do wypchnięcia zamiast 1 elementu.

Więc pamiętaj, aby nacisnąć odśwież lub wyciągnąć, jeśli pojawi się ten błąd, a następnie spróbuj ponownie.

1,21 gigawata
źródło
1

git pull --rebase origin master

git push origin master


git push -f wzorzec pochodzenia

Ostrzeżenie git push -f origin master

  • na siłę wypycha istniejące repozytorium, a także usuwa poprzednie repozytoria, więc jeśli nie potrzebujesz poprzednich wersji, może to być pomocne
Bhavesh Chand
źródło
1

Błąd prawdopodobnie wynika z innej struktury kodu, który zatwierdzasz i który jest obecny w GitHub. Możesz zapoznać się z: Jak radzić sobie z błędem „ odmowy scalania niepowiązanych historii ”:

$ git pull --allow-unrelated-histories
$ git push -f origin master
Kourosh Neyestani
źródło
1

Najlepsza opcja dla mnie i działa i jest prosta

git pull --rebase

następnie

git push

powodzenia

Omar Abusabha
źródło
1

Oto jak rozwiązałem ten problem:

  1. git pull origin master
  2. git push origin master

Zwykle dzieje się tak, gdy zdalna gałąź nie jest aktualizowana. A potem, jeśli pojawi się błąd typu „Proszę wprowadzić wiadomość dotyczącą zatwierdzenia”, odnieś się do tego (dla mnie odpowiedź xiaohu Wang działała :))

SalomiEdward
źródło
0

Najpierw miałem projekt SSDT VS. Chciałem przekazać projekt na Github, tak jak miałem. Chciałem, aby ten push był początkową wersją mojego repozytorium rozpoczynającą gałąź główną. Sugestia Donala dotycząca git push -f origin master była najłatwiejszym sposobem (jaki widziałem), aby to osiągnąć. Ponieważ nie musiałem się martwić o ponowne napisanie czegokolwiek, wydawało się to mieć sens.

cromastro
źródło
0

Miałem ten sam problem. Zdarzyło się, że utworzyłem plik .Readme w repozytorium bez wcześniejszego ściągania go.

Możesz usunąć plik .Readme lub wyciągnąć go przed wypchnięciem.

Martin Oputa
źródło
Nie jestem pewien, czy ta odpowiedź na pytanie sprzed 5 lat zapewnia jakąkolwiek dodatkową wartość, a ponadto nie zapewnia rozwiązania konkretnego problemu PO. Ponieważ jesteś nowym współtwórcą, zapoznaj się z przewodnikiem, jak odpowiadać na pytania: stackoverflow.com/help/how-to-answer
Sotiris Koukios-Panopoulos
0

możesz użyć

git pull --rebase <your_reponame> <your_branch>

pomoże to w przypadku, gdy niektóre zmiany nie zostały jeszcze zarejestrowane w lokalnym repozytorium. szczególnieREADME.md

szorstki
źródło