wake-up-neo.net

Warum sagt Git?

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

[email protected]:~/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 es beheben?

125
Harsukh Makwana

Derzeit passiert es, dass Sie über eine bestimmte Anzahl von Dateien verfügen, die Sie zuvor zusammengefügt haben, aber sie haben Zusammenführungskonflikte ausgelöst. Wenn ein Zusammenführungskonflikt auftritt, sollte er sie manuell lösen und die Datei festschreiben Änderungen mit git add file.name && git commit -m "removed merge conflicts". Nun hat ein anderer Benutzer die betreffenden Dateien in seinem Repository aktualisiert und seine Änderungen in das übliche Upstream-Repo verschoben.

Es kommt vor, dass Ihre Zusammenführungskonflikte von (wahrscheinlich) dem letzten Commit nicht gelöst wurden, sodass Ihre Dateien nicht ordnungsgemäß zusammengeführt werden, und daher das Flag U (unmerged) für die Dateien a git pull, git gibt den Fehler aus, weil Sie eine Version der Datei haben, die nicht richtig aufgelöst wird.

Um dies zu beheben, müssen Sie die fraglichen Zusammenführungskonflikte auflösen und die Änderungen hinzufügen und bestätigen, bevor Sie einen git pull ausführen können.

Beispielwiedergabe 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 einen git pull ausführen, werden Konflikte ausgelöst

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 im ursprünglichen Repo mehr Commits ausführen,

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

Und dann machen wir einen 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 file jetzt in einem nicht zusammengeführten Zustand befindet und wenn wir einen git status ausführen, können wir dasselbe 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 dieses Problem zu lösen, müssen wir zuerst den zuvor ignorierten Zusammenführungskonflikt lösen

repo_clone $ vi file

und setzen Sie den Inhalt auf

text2
text1
text1

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

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
162
mu 無

Sie versuchen, Ihrem lokalen Zweig ein neues Commit hinzuzufügen, während Ihr Arbeitsverzeichnis nicht sauber ist. Daher weigert sich Git, den Pull durchzuführen. Beachten Sie die folgenden Diagramme, um das Szenario besser zu visualisieren:

remote: A <- B <- C <- D  
local: A <- B *  
(* zeigt an, dass Sie über mehrere Dateien verfügen, die geändert, jedoch nicht festgeschrieben wurden.)

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

Option eins: Wirf die Änderungen weg  
Sie können entweder git checkout für jede nicht zusammengeführte Datei verwenden, oder Sie können git reset --hard HEAD verwenden, um alle Dateien in Ihrem Zweig auf HEAD zurückzusetzen. Übrigens ist HEAD in Ihrem lokalen Zweig B ohne ein Sternchen. Wenn Sie diese Option wählen, wird das Diagramm zu:

remote: A <- B <- C <- D  
local: A <- B

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

local: A <- B <- C <- D

Option zwei: Änderungen beibehalten  
Wenn Sie die Änderungen beibehalten möchten, müssen Sie zunächst alle Zusammenführungskonflikte in jeder der Dateien auflösen. Sie können jede Datei in Ihrer IDE öffnen und nach den folgenden Symbolen suchen:

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

Git stellt Ihnen zwei Versionen des Codes vor. Der in den HEAD - Markierungen enthaltene Code ist die Version Ihres aktuellen lokalen Zweigs. Die andere Version ist, was von der Fernbedienung kommt. Wenn Sie eine Version des Codes ausgewählt haben (und den anderen Code zusammen mit den Markierungen entfernt haben), können Sie jede Datei zu Ihrem Bereitstellungsbereich hinzufügen, indem Sie git add eingeben. Der letzte Schritt besteht darin, das Ergebnis zu bestätigen, indem Sie git commit -m mit einer entsprechenden Nachricht eingeben. An diesem Punkt sieht unser Diagramm so aus:

remote: A <- B <- C <- D  
local: 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 jetzt versuchen, zu ziehen, wird ein nicht schneller Vorwärtsfehler angezeigt. Git kann die Änderungen in Remote nicht in Ihrem Zweig abspielen, da sowohl Ihr Zweig als auch der Remote vom gemeinsamen Vorfahren-Commit B abgewichen sind. Wenn Sie ziehen möchten, können Sie an diesem Punkt entweder einen anderen git merge oder git rebase Ihren Zweig auf der Fernbedienung ausführen .

Um Git zu beherrschen, müssen Sie unidirektionale verknüpfte Listen verstehen und bearbeiten können. Ich hoffe, diese Erklärung wird Sie dazu bringen, mit Git in die richtige Richtung zu denken.

32
Tim Biegeleisen

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

vimdiff

Um Confects zu entfernen, können Sie verwenden

git mergetool

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

23
Pawan Seerwani

Wenn Sie einen entfernten Zweig herunterziehen möchten, um ihn lokal auszuführen (z. B. zu Überprüfungs- oder Testzwecken), und wenn Sie $ git pull sind, treten lokale Zusammenführungskonflikte auf

$ 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)
5
user5245397

Sie haben einige Dateien, die lokal zusammengeführt werden müssen, bevor Sie 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
5
Nick

Wenn Sie die Änderungen nicht zusammenführen möchten und trotzdem Ihr lokales Update aktualisieren möchten, wählen Sie den Befehl.

git reset HEAD —hard

Dies setzt Ihr lokales Gerät mit HEAD zurück und zieht dann Ihre Fernbedienung mit git pull!

3
Santosh

Es gab dasselbe Problem mit mir
In meinem Fall sind die Schritte wie folgt:

  1. Alle Dateien, die mit dem Symbol U (unmerged)gestartet wurden, wurden entfernt. wie- 

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

$ git pull Origin master
  1. Status geprüft

 $ git status

Hier ist die Botschaft, die erschienen ist-
und haben jeweils 2 und 1 verschiedene Commits.
(use "git pull" to merge the remote branch into yours)
Sie haben ungepflasterte Pfade.
(fix conflicts and run "git commit") 

Nicht zusammengeführte Pfade:
(benutze "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 an Kopf-

$ git commit -am "resolved conflict of the app."
  1. Schob den Code - 

$ git Push Origin master

Welche Wende kann mit diesem Bild gelöst werden -  enter image description here

1
S.Yadav

Wenn ein Zusammenführungskonflikt auftritt, können Sie einzelne Dateien öffnen. Sie erhalten die Symbole .__ "" <<<<<< oder >>>>>>> ". Diese beziehen sich auf Ihre Änderungen und die Änderungen, die auf der Fernbedienung vorhanden sind. Sie können den erforderlichen Teil manuell bearbeiten. danach speichern sie die datei und machen sie dann: git add 

Die Zusammenführungskonflikte werden gelöst.

0
dfordevy