Git Pull Fehler: Fehler: Remote Ref ist bei, aber erwartet


227

Vollständige Nachricht:

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
Anscheinend hat jemand die Geschichte des Repositorys umgeschrieben git push --force. Versuche zu rennen git pull --force.
Xaizek

1
Gibt den gleichen Fehler mit Git Push
Sanjeev Kumar Dangi

5
Die Antwort auf diese Frage hat diesen Fehler behoben
Sanjeev Kumar Dangi

Antworten:


225

Wenn Sie git unter einem Dateisystem ausführen, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird (Windows oder OS X), tritt dies auf, wenn zwei Zweige mit demselben Namen, aber unterschiedlicher Großschreibung vorhanden sind, z. B. user_model_changesund User_model_changeswenn beide Remote-Zweige mit derselben Verfolgungsreferenz übereinstimmen .

Löschen Sie den falschen Remote-Zweig (Sie sollten keine Zweige haben, die sich nur von Fall zu Fall unterscheiden) und dann git remote prune originund alles sollte funktionieren


danke für die Antwort. Dies war nicht das Problem mit diesem Fehler. Ich habe bereits die Lösung für dieses Problem gefunden und im Kommentar unter der Frage gepostet.
Sanjeev Kumar Dangi

2
Hilft auch für Mac OS X (das Standarddateisystem unterscheidet nicht zwischen Groß- und Kleinschreibung).
Tammo Freese

12
Ja, das Problem ohne Berücksichtigung der Groß- und Kleinschreibung unter Windows hat das Problem verursacht. Ich habe es behoben, indem ich den Ref in .git\refs\remotes\originOrdner manuell entfernt habe und dann git pullwieder.
Roy Ling

und für diejenigen, die nicht wissen, wo .git Ordner sein wird .. es wird in Ihrem Projekt / Arbeitsbereich Ordner erstellt: D
Kumar

1
Dies ist ein Git-Fehler (zumindest ist die Fehlermeldung falsch). Ich hoffe, jemand kann diesen Fehler dem Git-Projekt melden. Es scheint schwierig für mich, dem Git-Projekt einen Fehler zu melden. github.com/git/git
Bronzemann

190

Permanente Korrektur

git update-ref -d hat meine Instanz dieses Fehlers behoben, z

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

Beachten Sie, dass dies keine Auswirkungen auf Remote hat.

In meinem Fall hat ein nachfolgender git fetchAbruf dieses Zweigs und das anschließende Abrufen / Ziehen von Git nicht mehr den Fehler "Remote Ref ist bei, aber erwartet" ergeben.

Wenn das nicht funktioniert, eine vorübergehende Korrektur:

Beachten Sie auch, dass, wenn Sie sich nicht für den betreffenden Zweig interessieren (z. B. nur den Master aktualisieren möchten, nicht den Ursprung / Benutzer), eine git pullProblemumgehung darin besteht, den bestimmten Zweig, den Sie interessieren, abzurufen und dann einfach zusammenzuführen, z

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

Dies sollte die akzeptierte Lösung sein, da sie das Problem löst, ohne die Fernbedienung zu berühren.
Cerno

52

Löschen Sie einfach die Ordner und Dateien unter \.git\refs\remotes\origin. Funktioniert, wenn Sie keine Änderungen vorgenommen haben.


Dies könnte nicht funktionieren , wenn die Fernbedienung ref ‚verpackt‘ und daher nicht in refs / remotes / ** @ JDiMatteo-Lösung sollte dann noch funktionieren
Alexander Vogel

2
Hat für mich gearbeitet. Danke vielmals!
Swapnil Patwa

Lief wie am Schnürchen! Vielen Dank!
Anurag S Sharma

43

Ich habe dies ausgeführt, um das Problem zu lösen:

git gc --prune=now

2
Dies hat das Problem für mich behoben.
Aamir Rizwan

2
auch für mich ..-- :)
Aravind R Pillai

3
Danke, diese Lösung wurde für mich behoben. Könnten Sie bitte etwas mehr über die von Ihnen bereitgestellte Lösung erklären?
Aamol

1
Im Grunde ist es nur ein Git-Garbage-Collector-Tool, mit dem alles gelöscht wird, was nicht synchron ist, sich aber zu Caching-Zwecken auf dem lokalen Computer befindet
elad silver

42

Verwenden Sie die folgenden zwei Befehle nacheinander.

git gc --prune=now

git remote prune origin

Dadurch wird Ihr Problem behoben.


1
Dies funktioniert für mich, aber wenn ich einen anderen Git Pull
mache, taucht

@ Jojin Wie du. Und ich entschied mich schließlich für die Art und Weise, wie Prakash Saravanan sie
bereitstellte

1
Dies sollte höher bewertet werden als der Vorschlag, Git-Dateien zu bearbeiten :)
Mike Wise

Nur diese Lösung hat bei mir funktioniert. Vielen Dank!
Insaineyesay

12

Ich musste meinen Zweig von meiner Kommandozeile entfernen unter:

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

und dann manuell:

git pull [remote_name] [branch_name]

Ich konnte die Änderungen ziehen.

Hinweis: Ich habe SourceTree verwendet und konnte den Pull nicht ausführen .


Letztendlich habe ich meine Fernbedienungen umbenannt: Ich hatte zwei Fernbedienungen "Bitbucket / Staging" und "Bitbucket / Staging" in meinem SourceTree-Verlauf, aber nur "Bitbucket" wurde in der Befehlszeile angezeigt, wenn: git remote -v. Also habe ich Bitbucket in Bitbucket umbenannt und der Konflikt ist endlich verschwunden. Ich hoffe, dies hilft höchstwahrscheinlich SourceTree-Benutzern.
Jogam5

Ich musste auch den Zweig entfernen, .git\packed-refsbevor er für mich repariert wurde.
Michael

6

Ein Hard-Reset behebt auch das Problem

git reset --hard origin/master

Haben Sie eine beste Antwort ausgewählt?
Mruanova

5

Klarere Schritte

  1. im Terminal

    cd /.git/refs/remotes/origin
    
  2. tun ls, sehen Sie einige Zweige und Kopf

  3. Entfernen Sie den Zweig, von dem Sie glauben, dass er das Problem hat

    rm branchname
    
  4. Wenn es nicht funktioniert hat, löschen Sie alle Zweige / HEAD

    • Sie können ziehen

Hoffe es funktioniert jetzt.


Ist das im Wesentlichen dasselbe wie git update-ref -d <branchname>?
jt000

2

Versuchen Sie das, es hat bei mir funktioniert. In Ihrem Terminal : git remote prune origin.


2

Leider haben GIT-Befehle wie Prune und Reset oder Push bei mir nicht funktioniert. Prune arbeitete einmal und dann kehrte das Problem zurück.

Die dauerhafte Lösung, die für mich funktioniert hat, besteht darin, eine Git-Datei manuell zu bearbeiten. Gehen Sie einfach in den .git-Ordner des Projekts und öffnen Sie die Datei packed-refs in einem Texteditor wie Notepad ++. Navigieren Sie dann zu der Zeile mit dem fehlerhaften Zweig und aktualisieren Sie die Guid auf die erwartete.

Wenn Sie eine Nachricht haben wie:

"Fehler: Ref 'refs / remotes / origin / feature / branch_xxx' kann nicht gesperrt werden: ist bei 425ea23facf96f51f412441f41ad488fc098cf23, aber erwartet 383de86fed394ff1a1aeefc4a522d886adcecd79"

Suchen Sie dann in der Datei die Zeile mit 'refs / remotes / origin / feature / branch_xxx'. Die Guid dort wird die erwartete (2.) sein - 383de86fed394ff1a1aeefc4a522d886adcecd79. Sie müssen es in das echte (1.) ändern - 425ea23facf96f51f412441f41ad488fc098cf23.

Wiederholen Sie diesen Vorgang für die anderen fehlerhaften Zweige, und Sie können fortfahren. Manchmal musste ich nach dem erneuten Abrufen für dieselben Zweige wiederholen, die ich bereits zuvor 'repariert' hatte. Beim erneuten Abrufen aktualisiert GIT die Guids und gibt Ihnen die neuesten.

Auf jeden Fall ist das Problem kein Show Stopper. Die Verzweigungsliste wird aktualisiert. Dies ist eher eine Warnung.


1

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


0

Gleicher Fall hier, aber nichts über gepostete Kommentare ist in meinem Fall richtig. Ich habe nur einen Zweig (Master) und verwende nur das Unix-Dateisystem. Dieser Fehler tritt zufällig auf, wenn ich git fetch --progress --prune origin ausführe und der Zweig voraus ist oder 'Herkunft / Master'. Niemand kann sich verpflichten, nur 1 Benutzer kann Push ausführen.

HINWEIS: Ich habe ein Submodul im Acme-Repository und Acme hat neue Submoduländerungen (neue Commits). Ich muss zuerst ein Submodul-Update mit Git-Submodul-Update durchführen.

[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

Um dieses Problem zu lösen (in meinem Fall), führen Sie einfach den ersten Git-Push aus, wenn Ihr Zweig vor dem Ursprung liegt.


3
Ihre Antwort hier bezieht sich nur auf die Tatsache, dass Ihr lokales Repository nach einem neuen Commit vor dem Ursprung liegt. Dies ist der natürliche Zustand einer lokalen Git-Commit-Operation und bezieht sich nicht auf die ursprüngliche Frage.
Davient

0

Ich weiß, dass dies alt ist, aber ich habe meine eigene Lösung. Da ich den Quellbaum verwende, tritt dieser Fehler auf, weil jemand einen neuen Zweig erstellt. Der Quellbaum ist darüber verwirrt. Nachdem ich die Schaltfläche "Aktualisieren" neben der Combobox "Remote Branch to Pull" gedrückt habe, scheint Sourcetree die Verzweigungsliste aktualisiert zu haben, und jetzt kann ich erfolgreich ziehen.


0

Ich hatte das gleiche Problem, das verursacht wurde, weil ich auf ein älteres Commit zurückgesetzt habe, obwohl ich bereits auf den Remote-Zweig verschoben habe.

Ich habe es gelöst, indem ich meinen lokalen Zweig gelöscht, den Ursprungszweig ausgecheckt git checkout origin/my_branchund dann ausgeführt habegit checkout my_branch


0

Nach ständiger Suche ist dies die Lösung, die für mich funktioniert hat und das Aufheben / Entfernen des Upstreams beinhaltet

git branch --unset-upstream
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.