Git Pull: Fehler: Eintrag foo nicht aktuell. Kann nicht zusammengeführt werden

85

Ich versuche, mein Repo von einem Remote-Zweig aus zu aktualisieren und erhalte diesen Fehler immer wieder, wenn ich einen "Git Pull" mache. Ich habe keine lokalen Änderungen vorgenommen, und selbst wenn, muss ich sie nicht behalten.

Ich habe es versucht:

git reset --hard

und ich bekomme das gleiche Problem

Das einzige, was zu funktionieren scheint, ist, die fehlerhafte Datei zu löschen und erneut einen Git-Pull zu versuchen.

Ich habe auch versucht, git stashgefolgt von einem git pull. No Go.

Bearbeiten: Verwenden von PortableGit-1.6.4-Preview20090729, sodass alle vorherigen Fehler mit falschen Fehlern behoben werden sollten.

yuit
quelle
Überprüfen Sie, ob eine Erklärung in git.or.cz/gitwiki/GitFaq hilfreich ist .
Jakub Narębski
Ditto " Das einzige, was zu funktionieren scheint, ist, die fehlerhafte Datei zu löschen und erneut einen Git-Pull zu versuchen. " Für mich war mindestens eine Datei nicht in Git; Es wurde durch eine Platzhalterregel gitignored. Ich bin mir jedoch nicht sicher, warum sie Blocker waren.
Ruffin
3
Ich konnte dies durch Ausführen lösen. git rm --cached learned/tests/temp_funcs.pyDa ich sowieso wollte, dass die Datei in der Liste der nicht verfolgten Dateien verbleibt , wurde git rm --cachedich in diesem Fall entsperrt .
Tief
1
Dies geschah mir während einer Fusion, die ich wollte --abort. Keine der vorgeschlagenen Lösungen erlaubte mir den Abbruch, außer das Löschen der fehlerhaften Dateien.
Trevor Reid

Antworten:

55

Es gibt verschiedene Möglichkeiten, dies zu beheben, aber ich habe festgestellt, dass Git Stash gut für mich funktioniert. Es versetzt Ihre lokalen Änderungen vorübergehend an einen anderen Ort. Dann können Sie ziehen, um die neuesten Änderungen zu erfassen. Und dann können Sie Ihre lokalen Änderungen zurückerhalten.

Genau wie dieser:

$ git pull
...
...
file your_file.rb not up to date, cannot merge.

$ git stash
$ git pull
$ git stash pop
Manat
quelle
20
Aus der ursprünglichen Frage: "Ich habe auch" Git Stash "gefolgt von einem" Git Pull "ausprobiert. No go."
Charles Wood
Hat bei mir nicht funktioniert - in meinem Fall musste ich git rm --cached, vollständiger Kommentar: stackoverflow.com/questions/1248029/…
Deep
36

Dies kann passieren, wenn Sie den Index aktualisieren, um bestimmte Dateien zu ignorieren:

git update-index --assume-unchanged <file>

und dann zum Beispiel einen anderen Zweig auschecken:

git checkout <branch>
> error: Entry '<file>' not uptodate. Cannot merge.

Das Erzwingen einer Indexaktualisierung behebt das Problem:

git update-index --really-refresh
<file>: needs update

Gefolgt von:

git reset --hard 

Und dann sollte alles wieder normal sein.

Lebensräume
quelle
1
Ich konnte dies durch Ausführen lösen. git rm --cached learned/tests/temp_funcs.pyDa ich sowieso wollte, dass die Datei in der Liste der nicht verfolgten Dateien verbleibt , wurde git rm --cachedich in diesem Fall entsperrt .
Tief
3
Dem git update-index --really-refreshfehlte das Stück! Gut gemacht, das war schwer zu finden
Bernardo Dal Corno
28

Diese Art von Problem wird häufig durch den Versuch verursacht, aus einem Repository mit zwei Dateinamen zu ziehen, die sich nur für den Fall unterscheiden. Wenn Sie FAT, NTFS im Modus ohne Berücksichtigung der Groß- und Kleinschreibung (im Wesentlichen jedes Mal, wenn es unter Windows verwendet wird) oder HFS + im Modus ohne Berücksichtigung der Groß- und Kleinschreibung verwenden und zwei Dateien "foobar" und "FOOBAR" haben, werden in Git zwei unterschiedliche Dateien angezeigt Dateien, aber das Dateisystem sieht nur eine, was alle Arten von Problemen verursacht. Git checkt beispielsweise "FOOBAR" und dann "foobar" aus, wobei das Dateisystem den Inhalt von "FOOBAR" einfach ersetzt, aber an Ort und Stelle belässt. Nun zu Git scheint es, dass "FOOBAR" durch den Inhalt von "foobar" ersetzt wurde und "foobar" weg ist.

Es gibt zwei verschiedene Erscheinungsformen dieses Grundproblems. Eine ist, wenn Ihr Repository tatsächlich zwei Dateien enthält, die sich nur in Groß- und Kleinschreibung unterscheiden. In diesem Fall müssen Sie an einem Dateisystem arbeiten, bei dem zwischen Groß- und Kleinschreibung unterschieden wird, oder Sie müssen das Repository bearbeiten, um sicherzustellen, dass keine Kollisionen dieser Art auftreten. Ein Dateisystem, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, kann den Inhalt dieses Repositorys einfach nicht speichern.

Ein anderer Fall, den Sie umgehen können, ist, wenn eine Umbenennung erfolgt, die den Fall der Datei ändert. Angenommen, das Git-Repository enthält eine Umbenennung von "BEISPIEL" in "Beispiel". Bevor Git die neue Version auscheckt, wird versucht, sicherzustellen, dass keine vorhandene Datei auf Ihrer Festplatte überschrieben wird. Da es glaubt, dass "Beispiel" ein neuer Dateiname ist, fragt es das Dateisystem, ob es existiert, und das Dateisystem sieht "BEISPIEL" und sagt "Ja", so dass Git sich weigert, die neue Version auszuchecken, da es denkt, dass sie überschrieben wird nicht verfolgte Dateien. In diesem Fall, wenn Sie keine lokalen Änderungen haben, die Sie interessieren, eine einfachegit reset --hard <revision-to-checkout>Dies reicht im Allgemeinen aus, um das Problem zu überwinden und zur neuen Revision zu gelangen. Versuchen Sie einfach, Dateien nicht in andere Namen umzubenennen, die sich nur unterscheiden, wenn Sie sich in einem Dateisystem befinden, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, da dies zu solchen Problemen führen kann.

Brian Campbell
quelle
14

Um den Beitrag von @Brian Campbell weiter zu erläutern (weil das Zurücksetzen auch nicht funktioniert hat), möchte ich auf einen Randfall hinweisen, der mich aufhielt.

Ich hatte eine Datei OldFilein einen anderen Ordner verschoben und umbenannt NewFile. Ich habe dann die Datei als markiert assume-unchanged.

Dies hinderte mich daran, die Filialen zu wechseln, und es gab kein Versteck zum Speichern oder Festschreiben. Das Problem war, dass ich diese Dateiänderung nicht mit einem neuen Namen festgeschrieben habe, bevor ich das assume-unchangedFlag gesetzt habe. Also habe ich es zurückgesetzt no-assume-unchanged, festgeschrieben und dann wieder zurückgesetzt, assume-unchangedund ich konnte die Zweige wieder wechseln.

Aggressor
quelle
1
Diese Antwort hat mich auf den richtigen Weg gebracht, danke. Ich habe "git ls-files -v | grep '^ [[: lower:]]' | awk '{print $ 2}' | xargs git update-index --no-Annahme-unverändert" verwendet, um das Flag "Annahme-unverändert" zurückzusetzen , dann konnte ich --hard fehlerfrei zurücksetzen.
Okroquette
Ich denke, dies gilt auch für alle Dateien, die als "unverändert annehmen" markiert sind. Ich hatte das gleiche Problem beim Ignorieren von Änderungen an einer lokalen Datei, die ihren ursprünglichen Namen hatte. Ihr Kommentar erinnerte mich daran, dass ich diese Datei markiert hatte, danke!
Jake_
5
Ich habe das gleiche Problem. Grundsätzlich ist "unverändert annehmen" ein böses Merkmal. Sobald Sie es verwenden, ist es SEHR schwierig, andere Zweige zu überprüfen. Selbst wenn Sie verwenden checkout -f, wird es fehlschlagen.
John Henckel
13

Im Allgemeinen bedeutet dies, dass Sie Änderungen an Ihren lokalen Dateien haben, die nicht in Ihr lokales Repository übernommen wurden. Sie können diese Stackoverflow-Frage auch etwas detaillierter sehen.

Code inkarniert
quelle
11
Aus der Frage: "Ich habe keine lokalen Änderungen vorgenommen ..."
Charles Wood
Es ist ein Git-Bug oder eine Beschädigung des Git-Repositorys.
Warren P
11

Ich sah ein ähnliches Problem (Windows 10): Ich war eingeschaltet branchAund wollte zu gehen master. Ich hatte einige unverbindliche Änderungen, also zuerst ich git stashdann, git checkout -f masteraber ich bekam immer noch die Entry 'fileName' not uptodate. Cannot merge.

git status zeigte nichts zu begehen.

Irgendwann habe ich die Datei einfach manuell entfernt und konnte zu dem anderen Zweig wechseln (was natürlich dazu führte, dass meine Datei zurückkam), also habe ich irgendwo einen Fehler in git gefunden.

user276648
quelle
1
Dies ist die einzige Lösung für diese Frage, die für mich funktioniert hat. Ich habe den Fehler mit der .gitignoreDatei bekommen! Obwohl ich keine Änderungen daran vorgenommen hatte und Git es mir nicht erlaubte, es zu "verstauen" (weil es keine lokalen Änderungen gibt, duh!). Also habe ich die .gitignoreDatei aus dem Repository verschoben (als eine Art "Backup") und dann eine git reset --hard, die das Repository in einen vernünftigen Zustand "reparierte".
Maskierter Mann
git statuszeigte mir, welche Datei geändert wurde und deutete an, dass ich sie verwenden könnte, git restore myFileanstatt sie zu löschen, was funktionierte.
Noumenon
7

Dies kann auch bei Dateiberechtigungen ein Problem sein. Git versioniert sie auch, sofern die Konfiguration nichts anderes sagt. Fügen Sie einfach diese Antwort für Leute hinzu, die fast, aber nicht das gleiche Problem haben.

Drachenfels
quelle
5

Einen Versuch wert:

Könnten Sie nur für dieses Update den Konfigurationsparametercore.trustctime auf false setzen?

core.trustctime

Bei false werden die Zeitunterschiede zwischen dem Index und der Arbeitskopie ignoriert. Nützlich, wenn die Inode-Änderungszeit regelmäßig durch etwas außerhalb von Git geändert wird (Dateisystem-Crawler und einige Sicherungssysteme).

VonC
quelle
2
netter Fund, das hat bei mir tatsächlich funktioniert, als ich die obige Fehlermeldung beim Ausführen von "git reset --merge" sah. Wenn ich diesen Parameter auf false gesetzt habe, wurde der Fehler behoben.
DemitryT
1
Hat bei der Suche nach Konflikten mit einem anderen Zweig mit "git merge <feature> --no-ff --no-commit" und anschließend mit "git merge --abort" funktioniert. Xcode war in diesem Fall das "Etwas außerhalb von Git". Vielen Dank fast 10 Jahre später!
Ralfonso
@ Ralfonso Fast zehn Jahre später sind Sie herzlich willkommen :)
VonC
2

Ich füge meine Antwort hinzu, weil keiner der anderen dies erwähnt. In meinem Fall geschah dies, nachdem ich dem Index neue Dateien mit dem -NFlag hinzugefügt hatte , also fügte ich sie einfach dem Index hinzu, ohne ihren Inhalt hinzuzufügen. In diesem Zustand führt dies zu git stashdiesem Fehler.

Aviad P.
quelle
0

Ich hatte den gleichen Fehler nach einer Situation, in der für eine Datei git statusgesagt wurde, die nicht zum Staging-Bereich hinzugefügt wurde. dh unter der Überschrift "Änderungen nicht für Commit bereitgestellt". Sehr seltsam, das passiert normalerweise nicht.new file: foo.cpp

Lösung: git add foo.cppund dann git stashwieder funktioniert.

David Faure
quelle