Git push odrzucone „non-fast-forward”

90

Jestem dość nowy, gitale obecnie używam go do zarządzania naszym kodem w środowisku zespołowym. Miałem kilka problemów z ponownym bazowaniem i naprawiłem je za pomocą

git checkout --ours filename.txt
git add filename.txt
git rebase --continue

Teraz chcę wypchnąć moje zmiany, więc uruchamiam następujące polecenie

$ git push origin feature/my_feature_branch

daje mi następujący błąd:

To ssh://[email protected]:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://[email protected]:7999/repo/myproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Co mogę zrobić, aby pozbyć się błędu?

PS: W --forcemiarę możliwości unikam korzystania z tej opcji.

Frankline
źródło

Odpowiedzi:

76

Wygląda na to, że ktoś wepchnął nowe zatwierdzenia między Twoim ostatnim git fetcha git push. W takim przypadku musisz powtórzyć swoje kroki i ponownie bazować my_feature_branch.

git fetch
git rebase feature/my_feature_branch
git push origin feature/my_feature_branch

Po zakończeniu git fetchpolecam zbadać sytuację z gitk --all.

Borysa Brodskiego
źródło
Co zrobić, aby włączyć git pull origin master: master, który powinien domyślnie łączyć. Czy to konflikt scalania, czy nie. To jedyne zadane pytanie.
mathtick
24

Prawdopodobnie nie pobrałeś zdalnych zmian przed ponownym bazowaniem lub ktoś wprowadził nowe zmiany (podczas ponownego bazowania i próby wypychania). Spróbuj wykonać następujące czynności:

#fetching remote 'feature/my_feature_branch' branch to the 'tmp' local branch 
git fetch origin feature/my_feature_branch:tmp

#rebasing on local 'tmp' branch
git rebase tmp

#pushing local changes to the remote
git push origin HEAD:feature/my_feature_branch

#removing temporary created 'tmp' branch
git branch -D tmp
Inżynier
źródło
To rozwiązuje mój problem: kiedy popełniłem mój kod, zrobiłem rebase (za późno, były już zmiany, powinienem to zrobić przed zatwierdzeniem). Wtedy nawet nie było konfliktu, nie mogłem naciskać. Po zastosowaniu powyższej magii zadziałało. Dzięki.
Jing Li
18

Miałem ten problem! Próbowałem: git fetch + git merge, ale nie rozwiązałem! Próbowałem: git pull, a także nie rozwiązałem

Następnie spróbowałem tego i rozwiązałem mój problem (jest podobny do odpowiedzi Inżyniera):

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp
Aurelio A
źródło
7
To mnie wkurwiło, pchnąłem rzeczy bezpośrednio do mastera i pchnąłem wdrażanie z całego dnia ... i wszyscy są wkurzeni ... NIESAMOWITE WSKAZÓWKI!
Mike Q
6
Prawdopodobnie chcesz w skrócie wyjaśnić, co robisz, zanim dasz komuś niebezpieczne narzędzie.
Mirv - Matt,
10

Miałem podobny problem i rozwiązałem go: git pull origin

William Rossier
źródło
1
Pomógł mi, gdy otrzymałem omawiany błąd podczas wyciągania zdalnego oddziału.
GChuf
7

Spóźniłem się na imprezę, ale znalazłem kilka przydatnych instrukcji na stronie pomocy github i chciałem się nimi tutaj podzielić.

Czasami Git nie może dokonać zmiany w zdalnym repozytorium bez utraty zatwierdzeń. Kiedy tak się dzieje, twoje pchnięcie zostaje odrzucone.

Jeśli inna osoba przeszła do tej samej gałęzi co Ty, Git nie będzie w stanie przesłać Twoich zmian:

$ git push origin master
To https://github.com/USERNAME/REPOSITORY.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/USERNAME/REPOSITORY.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Możesz to naprawić, pobierając i scalając zmiany wprowadzone w zdalnej gałęzi ze zmianami, które wprowadziłeś lokalnie:

$ git fetch origin
# Fetches updates made to an online repository
$ git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

Lub możesz po prostu użyć git pulldo wykonania obu poleceń naraz:

$ git pull origin YOUR_BRANCH_NAME
# Grabs online updates and merges them with your local work
Bilal
źródło
4

spróbuj tego polecenia

$ git push -f -u origin <name of branch>

to znaczy $ git push -f -u origin master

ivever timothy
źródło
To zadziałało w moim przypadku, podczas gdy inni nie. Czasami wystarczy powiedzieć git -f -u
gcr
1

Blokada zapisu we współdzielonym repozytorium lokalnym

Miałem ten problem i żadna z powyższych rad mi nie pomogła. Udało mi się wszystko poprawnie pobrać. Ale push zawsze zawodził. Było to repozytorium lokalne zlokalizowane w katalogu Windows z kilkoma klientami pracującymi z nim poprzez sterownik folderu współdzielonego VMWare. Okazało się, że jeden z systemów zablokował repozytorium Git do zapisu. Po zatrzymaniu odpowiedniego systemu VMWare, co spowodowało blokadę, wszystko naprawiano natychmiast. Niemal niemożliwe było ustalenie, który system powoduje błąd, więc musiałem je po kolei zatrzymywać, aż się udało.

Boris Zinchenko
źródło
1

Cóż, skorzystałem z porady tutaj i wkręciło mnie to, ponieważ połączyło mój lokalny kod bezpośrednio z masterem. .... więc traktuj to wszystko z przymrużeniem oka. Mój współpracownik powiedział, że poniższe rozwiązania pomogły w rozwiązaniu problemu potrzebnego do zmiany oddziału.

 git branch --set-upstream-to=origin/feature/my-current-branch feature/my-current-branch
Mike Q
źródło
0

W Eclipse wykonaj następujące czynności:

Repozytoria GIT> Piloty> Pochodzenie> Kliknij prawym przyciskiem myszy i powiedz pobieranie

Repozytoria GIT> Zdalne śledzenie> Wybierz oddział i powiedz scalaj

Przejdź do projektu, kliknij prawym przyciskiem myszy plik i powiedz Pobierz z nadrzędnego.

MansoorShaikh
źródło
0
  1. przenieś kod do nowej gałęzi - git branch -b tmp_branchyouwantmergedin
  2. zmień na gałąź, z którą chcesz się połączyć - git checkout mycoolbranch
  3. zresetuj gałąź, do której chcesz się scalić - git branch reset --hard HEAD
  4. połącz gałąź tmp w żądaną gałąź - git branch merge tmp_branchyouwantmergedin
  5. push to origin
Richard
źródło
0

Oto inne rozwiązanie tego problemu

>git pull
>git commit -m "any meaning full message"
>git push
Sheo Dayal Singh
źródło
-1
  1. Cofnij lokalne zatwierdzenie. Spowoduje to po prostu cofnięcie zatwierdzenia i zachowanie zmian w kopii roboczej
git reset --soft HEAD~1
  1. Pobierz najnowsze zmiany
git pull
  1. Teraz możesz zatwierdzać zmiany na podstawie najnowszego kodu
alk453
źródło