git pull error: error: zdalny ref jest na, ale oczekiwany


227

Pełna wiadomość:

error: Ref refs/remotes/origin/user is at 3636498c2ea7735fdcedc9af5ab3c8689e6abe77 but expected a21359c6cc2097c85775cde6a40105f4bd7100ec
From github.com:{github project url}
 ! a21359c..6273ffc  user -> origin/user  (unable to update local ref)

3
Najwyraźniej ktoś przepisał historię repozytorium przez git push --force. Spróbuj uciec git pull --force.
xaizek

1
Daje ten sam błąd z git push --force
Sanjeev Kumar Dangi

5
Odpowiedź na to pytanie rozwiązała ten błąd - stackoverflow.com/questions/3046436/…
Sanjeev Kumar Dangi

Odpowiedzi:


225

Jeśli korzystasz z git w systemie plików, który nie rozróżnia wielkości liter (Windows lub OS X), nastąpi to, jeśli istnieją dwie gałęzie o tej samej nazwie, ale o różnej wielkości liter, np. user_model_changesI User_model_changesponieważ obie zdalne gałęzie będą pasować do tej samej referencji śledzenia .

Usuń niewłaściwą gałąź zdalną (nie powinieneś mieć gałęzi, które różnią się tylko wielkością liter), a następnie git remote prune originwszystko powinno działać


Dziękuję za odpowiedź. To nie był problem z tym błędem. Znalazłem już rozwiązanie tego problemu i opublikowałem w komentarzu pod pytaniem.
Sanjeev Kumar Dangi

2
Pomaga również w systemie Mac OS X (domyślny system plików nie rozróżnia wielkości liter).
Tammo Freese,

12
tak, problem z rozróżnianiem wielkości liter w systemie Windows spowodował problem. Naprawiłem to ręcznie usuwając .git\refs\remotes\originplik ref w folderze, a następnie git pullponownie.
Roy Ling,

a dla tych, którzy nie wiedzą, gdzie będzie folder .git .. zostanie on utworzony w folderze Project / workspace: D
kumar

1
To błąd git (przynajmniej komunikat o błędzie jest niepoprawny). Mam nadzieję, że ktoś może zgłosić ten błąd do projektu git. Trudno mi zgłosić błąd do projektu git. github.com/git/git
brąz mężczyzna

190

Permanent Fix

git update-ref -d rozwiązałem moją instancję tego błędu, np

git update-ref -d refs/remotes/origin/user

Pamiętaj, że nie ma to wpływu na zdalne.

W moim przypadku kolejne git fetchpobranie ponownie tej gałęzi i kolejne pobrania / ściągnięcia gita nie dawały już błędu „zdalne odwołanie jest na, ale oczekiwane”.

Jeśli to nie zadziała, tymczasowa poprawka:

Zauważ również, że jeśli nie obchodzi Cię gałąź (np. Chcesz po prostu zaktualizować wzorzec, a nie źródło / użytkownika), git pullobejście polega na pobraniu, a następnie scaleniu konkretnej gałęzi, na której Ci zależy, np.

git fetch # may give an error for a particular branch, but other branches will still be successfully fetched
git merge origin/master

To powinno być przyjęte rozwiązanie, ponieważ rozwiązuje problem bez dotykania pilota.
Cerno

52

Po prostu usuń foldery i pliki w obszarze \.git\refs\remotes\origin. Działa, gdy nie masz nieprzypisanych zmian.


Może to nie zadziałać, jeśli zdalne odwołanie jest „spakowane”, a zatem nie znajduje się w poleceniu / pilocie / ** @ Rozwiązanie JDiMatteo powinno nadal działać
Alexander Bird,

2
Pracował dla mnie. Wielkie dzięki!
Swapnil Patwa

Działa jak urok! Dzięki!
Anurag S Sharma

43

Uruchomiłem to, aby rozwiązać problem:

git gc --prune=now

2
To rozwiązało problem.
Aamir Rizwan

2
dla mnie też ...-- :)
Aravind R Pillai

3
Dzięki, to rozwiązanie dla mnie naprawiło. Czy mógłbyś wyjaśnić nieco więcej na temat podanego rozwiązania.
Aamol,

1
w zasadzie jest to tylko narzędzie do zbierania śmieci git, więc usuwa wszystko, co nie jest zsynchronizowane, ale znajduje się na lokalnym komputerze w celu buforowania
Elad Silver

42

Użyj poniższych dwóch poleceń jeden po drugim.

git gc --prune=now

git remote prune origin

To rozwiąże problem.


1
To działa dla mnie, ale kiedy robię kolejną
akcję,

@Jojin To samo co ty. I w końcu wybrałem sposób, w jaki zapewnił Prakash Saravanan
xi.lin

1
To powinno być ocenione wyżej niż sugestia edycji plików git :)
Mike Wise

tylko to rozwiązanie działało dla mnie. Dzięki!
insaineyesay

12

Musiałem usunąć swój oddział z wiersza poleceń pod adresem:

.git\refs\remotes\{my remote}\{**my branch**}

a następnie ręcznie wykonując:

git pull [remote_name] [branch_name]

Byłem w stanie wyciągnąć zmiany.

Uwaga: korzystałem z SourceTree i nie mogłem wykonać ściągania.


Ostatecznie zmieniłem nazwę moich pilotów: w mojej historii SourceTree miałem dwa piloty: „Bitbucket / staging” i „bitbucket / staging”, ale podczas wykonywania polecenia pojawił się tylko „Bitbucket”: git remote -v. Zmieniłem nazwę Bitbucket na Bitbucket i konflikt ostatecznie zniknął, mam nadzieję, że to pomoże najbardziej prawdopodobnym użytkownikom SourceTree.
jogam5

Musiałem też usunąć gałąź, .git\packed-refszanim została dla mnie naprawiona.
Michael

6

Twardy reset również rozwiąże problem

git reset --hard origin/master

Czy wybrałeś najlepszą odpowiedź?
mruanova

5

Jaśniejsze kroki

  1. w terminalu

    cd /.git/refs/remotes/origin
    
  2. zrób ls, zobaczysz kilka gałęzi i HEAD

  3. Usuń gałąź, która Twoim zdaniem ma problem

    rm branchname
    
  4. Jeśli to nie zadziałało, usuń wszystkie gałęzie / HEAD

    • możesz chcieć pociągnąć

Mam nadzieję, że teraz działa.


czy jest to w zasadzie to samo co git update-ref -d <branchname>?
jt000


2

Niestety polecenia GIT, takie jak przycinanie i resetowanie lub push, nie działały dla mnie. Prune zadziałało raz, a potem problem powrócił.

Stałym rozwiązaniem, które działało dla mnie, jest ręczna edycja pliku git. Wystarczy przejść do folderu .git projektu, a następnie otworzyć plik spakowany w edytorze tekstu, takim jak Notepad ++. Następnie przejdź do wiersza z uszkodzoną gałęzią i zaktualizuj jego identyfikator GUID do oczekiwanego.

Jeśli masz wiadomość typu:

„błąd: nie można zablokować ref 'referencje / piloty / pochodzenie / funkcja / gałąź_xxx': jest na 425ea23facf96f51f412441f41ad488fc098cf23, ale oczekiwany 383de86fed394ff1a1aeefef4a522d886adcecd79”

następnie w pliku znajdź wiersz z „refs / remotes / origin / feature / branch_xxx”. Przewodnikiem będzie oczekiwany (drugi) - 383de86fed394ff1a1aeefc4a522d886adcecd79. Musisz zmienić go na prawdziwy (pierwszy) - 425ea23facf96f51f412441f41ad488fc098cf23.

Powtórz tę czynność dla pozostałych wadliwych gałęzi, a będziesz mógł kontynuować. Czasami po ponownym pobieraniu musiałem powtarzać dla tych samych gałęzi, które już wcześniej „naprawiłem”. Po ponownym pobraniu GIT aktualizuje przewodniki i daje najnowszą.

W każdym razie problem nie ogranicza programu. Lista oddziałów zostanie zaktualizowana. To raczej ostrzeżenie.


1

git for-each-ref --format = 'delete% (refname)' refs / original | git update-ref --stdin git reflog wygasają --expire = teraz --all git gc --prune = teraz


0

Ten sam przypadek tutaj, ale nic o opublikowanych komentarzach jest właściwe w moim przypadku, mam tylko jedną gałąź (master) i używam tylko systemu plików Unix, ten błąd występuje losowo, gdy uruchamiam git fetch --progress - wycinanie źródła i gałąź jest przed lub „origin / master”. Nikt nie może zatwierdzić, tylko 1 użytkownik może wykonać wypychanie.

UWAGA: Mam podmoduł w repozytorium acme, a acme mam nowe zmiany submodułu (nowe zatwierdzenia), najpierw muszę wykonać aktualizację podmodułu za pomocą aktualizacji git.

[2014-07-29 13:58:37] Payload POST received from Bitbucket
[2014-07-29 13:58:37] Exec: cd /var/www/html/acme
---------------------
[2014-07-29 13:58:37] Updating Git code for all branches
[2014-07-29 13:58:37] Exec: /usr/bin/git checkout --force master
[2014-07-29 13:58:37] Your branch is ahead of 'origin/master' by 1 commit.
[2014-07-29 13:58:37]   (use "git push" to publish your local commits)
[2014-07-29 13:58:37] Command returned some errors:
[2014-07-29 13:58:37] Already on 'master'
---------------------
[2014-07-29 13:58:37] Exec: /usr/bin/git fetch --progress --prune origin
[2014-07-29 13:58:39] Command returned some errors:
[2014-07-29 13:58:39] error: Ref refs/remotes/origin/master is at 8213a9906828322a3428f921381bd87f42ec7e2f but expected c8f9c00551dcd0b9386cd9123607843179981c91
[2014-07-29 13:58:39] From bitbucket.org:acme/acme
[2014-07-29 13:58:39]  ! c8f9c00..8213a99  master     -> origin/master  (unable to update local ref)
---------------------
[2014-07-29 13:58:39] Unable to fetch Git data

Aby rozwiązać ten problem (w moim przypadku), po prostu uruchom pierwszy git push, jeśli twoja gałąź jest przed początkiem.


3
Twoja odpowiedź tutaj odnosi się tylko do faktu, że twoje lokalne repozytorium wyprzedza początek po nowym zatwierdzeniu. Jest to naturalny stan lokalnej operacji git commit i nie odnosi się do pierwotnego pytania.
davient

0

Wiem, że to stare, ale mam własną poprawkę. Ponieważ korzystam z drzewa źródłowego, ten błąd występuje, ponieważ ktoś tworzy nową gałąź. Drzewo źródłowe jest zdezorientowane. Po naciśnięciu przycisku „Odśwież” obok pola „Zdalna gałąź do ściągnięcia” wydaje się, że sourcetree zaktualizowało listę gałęzi i teraz mogę pomyślnie pobrać.


0

Miałem ten sam problem, który został spowodowany, ponieważ zresetowałem do starszego zatwierdzenia, mimo że już pchnąłem do zdalnej gałęzi.

Rozwiązałem go, usuwając mój lokalny oddział, a następnie sprawdzając gałąź źródłową, git checkout origin/my_brancha następnie wykonującgit checkout my_branch


-1

Po ciągłym szukaniu jest to rozwiązanie, które zadziałało dla mnie, co wymaga rozbrojenia / usunięcia Upstream

git branch --unset-upstream
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.