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://git@coderepo.com:7999/repo/myproject.git
 ! [rejected]        feature/my_feature_branch -> feature/my_feature_branch (non-fast-forward)
error: failed to push some refs to 'ssh://git@coderepo.com: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.


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.


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

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

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


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

4

spróbuj tego polecenia

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

to znaczy $ git push -f -u origin master


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.


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

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.


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


-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
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.