Warum sagt git "Pull ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben"?

195

Wenn ich versuche, mein Projektverzeichnis im Terminal abzurufen, wird der folgende Fehler angezeigt:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Warum sagt git "Pull is not possible because you have unmerged files"und wie kann ich das beheben?

Harsukh Makwana
quelle
1
In meinem Fall habe ich nur diese Befehle "git add" verwendet. dann "git commit -m" Test "und am Ende" git push ". Fehler
behoben
Sie mussten lediglich "$ git add <Datei>" hinzufügen, um zu aktualisieren, was festgeschrieben oder wiederhergestellt werden soll (um Änderungen im Arbeitsverzeichnis zu verwerfen), dann "$ git commit" und dann "$ git push" festschreiben, um die Zusammenführung abzuschließen.
find_X
Falls es hilft: Mir ist aufgefallen, dass ich nur "git add" mache. dann hat das Festschreiben nicht funktioniert. Ich musste die einzelne Datei nach Namen hinzufügen, dann festschreiben und ziehen / pushen.
Ouonomos

Antworten:

212

Was derzeit passiert, ist, dass Sie über einen bestimmten Satz von Dateien verfügen, die Sie zuvor zusammengeführt haben, die jedoch Zusammenführungskonflikte ausgelöst haben. Wenn ein Zusammenführungskonflikt auftritt, sollte er diese im Idealfall manuell lösen und die Änderungen mithilfe von festschreiben git add file.name && git commit -m "removed merge conflicts". Jetzt hat ein anderer Benutzer die fraglichen Dateien in seinem Repository aktualisiert und seine Änderungen auf das gemeinsame Upstream-Repo übertragen.

Es kommt also vor, dass Ihre Zusammenführungskonflikte aus (wahrscheinlich) dem letzten Commit nicht gelöst wurden, sodass Ihre Dateien nicht in Ordnung zusammengeführt werden und daher das Flag U( unmerged) für die Dateien. Wenn Sie also a git pullausführen, gibt git den Fehler aus, da Sie eine Version der Datei haben, die nicht korrekt behoben wurde.

Um dies zu beheben, müssen Sie die fraglichen Zusammenführungskonflikte lösen und die Änderungen hinzufügen und festschreiben, bevor Sie eine ausführen können git pull.

Beispielreproduktion und Lösung des Problems:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Lassen Sie uns zunächst die Repository-Struktur erstellen

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Jetzt sind wir in repo_clone und wenn Sie a tun git pull, wird es Konflikte auslösen

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Wenn wir die Konflikte im Klon ignorieren und jetzt mehr Commits im ursprünglichen Repo vornehmen,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Und dann machen wir ein git pull, wir bekommen

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Beachten Sie, dass sich das fileJetzt in einem nicht zusammengeführten Zustand befindet. Wenn wir a ausführen git status, können wir dasselbe deutlich sehen:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Um dies zu lösen, müssen wir zuerst den Zusammenführungskonflikt lösen, den wir zuvor ignoriert haben

repo_clone $ vi file

und setzen Sie seinen Inhalt auf

text2
text1
text1

und fügen Sie es dann hinzu und übernehmen Sie die Änderungen

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
mu 無
quelle
1
Um vollständig zu sein, würde ich die Antwort von @ Pawan hinzufügen, um 'git mergetool' zur Lösung von Konflikten zu verwenden. Der vorletzte Schritt ist möglicherweise nicht sehr praktisch ("Löse die Zusammenführung auf ... [durch Einstellen] ... ihres Inhalts auf: [irgendein Text]").
unbestreitbarrob
Alternativ können Sie mithilfe der Empfehlungen von @ user261 zusammenführen. In jedem Fall würde ein Hinzufügen eines Schritts zum praktischen Zusammenführen diese Antwort vervollständigen.
unbestreitbarrob
3
Diese Antwort funktioniert sehr gut, wenn Sie einfache Konflikte haben, die bei einzelnen Dateien behoben werden müssen. Zum Beispiel eine oder zwei unterschiedliche Codezeilen. Wenn Sie mehrere Dateien haben, die stark geändert wurden, ist dies eine schwierige Lösung. Aber es bringt die Idee auf den Punkt, dass Sie sich mit Git häufig verpflichten sollten, um schwierige Konflikte zu vermeiden.
Vaughn D. Taylor
46

Sie versuchen, Ihrem lokalen Zweig weitere neue Commits hinzuzufügen, während Ihr Arbeitsverzeichnis nicht sauber ist. Infolgedessen weigert sich Git, den Pull durchzuführen. Betrachten Sie die folgenden Diagramme, um das Szenario besser zu veranschaulichen:

remote: A <- B <- C <- D
local: A <- B *
(* zeigt an, dass Sie mehrere Dateien haben, die geändert, aber nicht festgeschrieben wurden.)

Es gibt zwei Möglichkeiten, um mit dieser Situation umzugehen. Sie können die Änderungen in Ihren Dateien entweder verwerfen oder beibehalten.

Option 1: Änderungen wegwerfen
Sie können entweder git checkoutfür jede nicht zusammengeführte Datei verwenden oder git reset --hard HEADalle Dateien in Ihrem Zweig auf HEAD zurücksetzen. Übrigens ist HEAD in Ihrer lokalen Niederlassung B ohne Sternchen. Wenn Sie diese Option wählen, wird das Diagramm wie folgt:

Remote: A <- B <- C <- D
lokal: A <- B.

Wenn Sie jetzt ziehen, können Sie Ihren Zweig mit den Änderungen vom Master vorspulen. Nach dem Ziehen würde Ihr Zweig wie ein Meister aussehen:

lokal: A <- B <- C <- D.

Option 2: Behalten Sie die Änderungen bei
Wenn Sie die Änderungen beibehalten möchten, müssen Sie zuerst alle Zusammenführungskonflikte in jeder der Dateien lösen. Sie können jede Datei in Ihrer IDE öffnen und nach folgenden Symbolen suchen:

<<<<<<< HEAD
// Ihre Version des Codes
=======
// die Version des Codes der Fernbedienung
>>>>>>>

Git präsentiert Ihnen zwei Codeversionen. Der in den HEAD-Markern enthaltene Code ist die Version Ihrer aktuellen lokalen Niederlassung. Die andere Version kommt von der Fernbedienung. Nachdem Sie eine Version des Codes ausgewählt (und den anderen Code zusammen mit den Markierungen entfernt) haben, können Sie jede Datei durch Eingabe zu Ihrem Staging-Bereich hinzufügen git add. Der letzte Schritt besteht darin, Ihr Ergebnis durch Eingabe git commit -m einer entsprechenden Nachricht festzuschreiben. Zu diesem Zeitpunkt sieht unser Diagramm folgendermaßen aus:

Remote: A <- B <- C <- D
lokal: A <- B <- C '

Hier habe ich das Commit, das wir gerade gemacht haben, als C 'bezeichnet, weil es sich vom Commit C auf der Fernbedienung unterscheidet. Wenn Sie nun versuchen zu ziehen, wird ein nicht schneller Vorlauffehler angezeigt. Git kann die Änderungen in Remote auf Ihrem Zweig nicht abspielen, da sowohl Ihr Zweig als auch die Fernbedienung vom Commit B des gemeinsamen Vorfahren abweichen. Wenn Sie zu diesem Zeitpunkt ziehen möchten, können Sie entweder einen anderen git mergeoder git rebaseIhren Zweig auf der Fernbedienung ausführen.

Um Git zu beherrschen, muss man in der Lage sein, unidirektionale verknüpfte Listen zu verstehen und zu bearbeiten. Ich hoffe, diese Erklärung bringt Sie dazu, in die richtige Richtung über die Verwendung von Git nachzudenken.

Tim Biegeleisen
quelle
33

Es gibt eine einfache Lösung dafür. Dafür müssen Sie jedoch zunächst Folgendes lernen

vimdiff

Um Konflikte zu entfernen, können Sie verwenden

git mergetool

Der obige Befehl öffnet grundsätzlich die lokale Datei, die gemischte Datei und die entfernte Datei (insgesamt 3 Dateien) für jede in Konflikt stehende Datei. Die lokalen und Remote-Dateien dienen nur als Referenz. Mithilfe dieser Dateien können Sie auswählen, was in die gemischte Datei aufgenommen werden soll (oder nicht). Und speichern und beenden Sie einfach die Datei.

Pawan Seerwani
quelle
2
Ich würde sagen, dass vimdiff nicht erforderlich ist (Sie können ein beliebiges Merge / Diff-Tool Ihrer Wahl verwenden, z. B. WinMerge oder das in OSX integrierte FileMerge usw.). Trotzdem ist dies eine großartige Ergänzung zu @ mus Antwort.
unbestreitbarrob
32

Wenn Sie die Änderungen nicht zusammenführen und dennoch Ihr lokales aktualisieren möchten, führen Sie Folgendes aus:

git reset --hard HEAD  

Dadurch wird Ihr lokales Gerät mit HEAD zurückgesetzt und Ihre Fernbedienung mit git pull gezogen.

Wenn Sie Ihre Zusammenführung bereits lokal festgeschrieben haben (aber noch nicht auf Remote übertragen haben) und sie auch zurücksetzen möchten:

git reset --hard HEAD~1 
Santosh
quelle
6

Wenn Sie einen Remote-Zweig herunterziehen möchten, um ihn lokal auszuführen (z. B. zu Überprüfungs- oder Testzwecken), und wenn Sie $ git pulllokale Zusammenführungskonflikte erhalten:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
user5245397
quelle
5

Sie haben einige Dateien lokal, die zusammengeführt werden müssen, bevor Sie ziehen können. Sie können die Dateien auschecken und dann ziehen, um Ihre lokalen Dateien zu überschreiben.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
Nick
quelle
Durch das Zusammenführen werden die Inhalte zweier Dateien kombiniert. Derzeit unterscheiden sich Ihre lokalen Dateien von denen auf dem Remote-Server. Das Zusammenführen muss auf dem Remote-Server erfolgen. Wenn Sie also Ihre bearbeiteten Dateien bereitstellen und pushen, werden Ihre Änderungen den Dateien im Repository hinzugefügt. Dann sind Ihre Dateien synchron und Sie können das gesamte Projekt mit anderen Änderungen abrufen. Ich fand das Git-Hilfebuch sehr hilfreich, als ich anfing, Git zu verwenden. Sie finden es hier: git-scm.com/book/en/Getting-Started
Nick
Beachten Sie, dass ich nicht der OP bin. "Zusammenführen von Dateien" ist eine falsche Terminologie. Genau genommen führen Sie Commits zusammen, keine Dateien.
Jub0bs
Ah ja das ist wahr, meine apoligies. Ich habe versucht, eine einfache Antwort zu geben
Nick
Wenn Sie beim Zusammenführen eines Commits Konflikte haben, dann haben Sie widersprüchliche, nicht zusammengeführte Dateien, und Sie müssen sie zusammenführen.
Edward Thomson
3

Schritte zum folgen :

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Danke, Sarbasish

Sarbasish Mishra
quelle
2


Bei mir gab es das gleiche Problem. In meinem Fall sind die Schritte wie folgt:

  1. Alle Dateien, die mit dem U- Symbol (nicht zusammengeführt) gestartet wurden, wurden entfernt . wie-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Code vom Master ziehen

$ git pull origin master
  1. Auf Status geprüft

 $ git status

Hier ist die Nachricht, die erschienen ist -
und die jeweils 2 und 1 unterschiedliche Festschreibungen haben. Sie haben ungebundene Wege.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Nicht zusammengeführte Pfade:
(Verwenden Sie "git add ...", um die Auflösung zu markieren.)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Alle neuen Änderungen hinzugefügt -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Änderungen am Kopf festschreiben

$ git commit -am "resolved conflict of the app."
  1. Code gedrückt -

$ git push origin master

Welche Runde kann mit diesem Bild behoben werden - Geben Sie hier die Bildbeschreibung ein

S. Yadav
quelle
1

Wenn ein Zusammenführungskonflikt auftritt, können Sie einzelne Dateien öffnen. Sie erhalten Symbole "<<<<<<< oder >>>>>>>". Diese beziehen sich auf Ihre Änderungen und die auf der Fernbedienung vorhandenen Änderungen. Sie können das erforderliche Teil manuell bearbeiten. Speichern Sie danach die Datei und führen Sie Folgendes aus: git add

Die Zusammenführungskonflikte werden gelöst.

dfordevy
quelle
-1

Führen Sie einfach diesen Befehl aus:

git reset --hard
Grace Green
quelle
3
Sie sollten erklären, was der Befehl tut, da einige Leute sehr enttäuscht sein werden, wenn sie versuchen herauszufinden, dass alle ihre aktuellen lokalen Änderungen gelöscht wurden: /
Joseph Budin
Dies funktioniert, wenn Sie Ihre Änderungen nur in eine externe temporäre Quelle kopieren. Wenn Sie nur einige Dateien haben, z. B. Konfigurationsdateien für ein Projekt, ist dies perfekt. Führen Sie den Befehl aus und setzen Sie Ihre Änderungen zurück. Funktioniert bei mir!
Cwiggo