Git Pull ist nicht möglich, nicht zusammengeführte Dateien

88

Ich habe alle ähnlichen Fragen dazu gelesen. es scheint, dass keine der folgenden funktioniert hat:

Delete offending files
git reset --hard HEAD
git stash
git pull

Nahezu jede Kombination, bei der Änderungen gespeichert und aus dem Repository abgerufen werden, führt zu nicht zusammenlegbaren Dateien. Ich möchte alle lokalen Änderungen verwerfen und nur die Fernbedienung verwenden, kann aber nicht erneut klonen (Einschränkungen der Bandbreite und der Internetnutzung, wenn der Entwickler dies versucht). Wie mache ich das?

Gerade versucht:

git stash
git pull

Hat auch nicht funktioniert.

Mehr Info

Es gibt ein lokales Commit, und der Upstream hat auch ein Commit. Ich habe es also versucht, git pull --rebaseaber es funktioniert immer noch nicht richtig ... Das gibt mir Fehler - "Beenden wegen eines ungelösten Konflikts". Wenn ich das tue git stash, git reset --hard HEAD, git pull --rebase, erhalte ich die Fehlermeldung "Pull ist nicht möglich, nicht zusammengeführte Änderungen ..."

Christian Stewart
quelle

Antworten:

198

Angenommen, die Fernbedienung ist originund der Zweig ist masterund Sie haben bereits masterausgecheckt, versuchen Sie möglicherweise Folgendes:

git fetch origin
git reset --hard origin/master

Dies nimmt im Grunde nur den aktuellen Zweig und zeigt ihn auf den HEADdes entfernten Zweigs.

WARNUNG : Wie in den Kommentaren angegeben, werden dadurch Ihre lokalen Änderungen verworfen und mit dem, was sich auf dem Ursprung befindet, überschrieben .

Oder Sie können die Installationsbefehle verwenden, um im Wesentlichen dasselbe zu tun:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

EDIT: Ich möchte kurz erklären, warum dies funktioniert.

Der .gitOrdner kann die Commits für eine beliebige Anzahl von Repositorys enthalten. Da der Commit-Hash tatsächlich eine Überprüfungsmethode für den Inhalt des Commits ist und nicht nur ein zufällig generierter Wert, wird er zum Abgleichen von Commit-Sets zwischen Repositorys verwendet.

Ein Zweig ist nur ein benannter Zeiger auf einen bestimmten Hash. Hier ist ein Beispielsatz:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Jede dieser Dateien enthält einen Hash, der auf ein Commit verweist:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Diese sind alle für den internen Git-Speichermechanismus vorgesehen und funktionieren unabhängig vom Arbeitsverzeichnis . Gehen Sie wie folgt vor:

git reset --hard origin/master

git zeigt den aktuellen Zweig auf denselben Hashwert, auf den origin / master zeigt. Anschließend wird das Arbeitsverzeichnis zwangsweise geändert, um der Dateistruktur / dem Inhalt an diesem Hash zu entsprechen.

Um dies bei der Arbeit zu sehen, probieren Sie Folgendes aus:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD
Trevor Norris
quelle
1
Aus der kürzlich genehmigten Bearbeitung wird die massive Warnung am Anfang hinzugefügt, nur um darauf hinzuweisen, dass sie bereits erwähnt wurde: "Dann ändert [git] das Arbeitsverzeichnis mit Nachdruck, um es an die Dateistruktur / den Inhalt an diesem Hash anzupassen." Aber ich denke, das war nicht explizit genug.
Trevor Norris
5

Gelöst mit dem folgenden Befehlssatz:

git reset --hard
git pull --rebase
git rebase --skip
git pull

Der Trick besteht darin, die Änderungen neu zu begründen ... Wir hatten einige Probleme, ein triviales Festschreiben neu zu begründen, und haben es einfach mit git rebase --skip übersprungen (nachdem wir die Dateien kopiert haben).

Christian Stewart
quelle
2

Wenn dieses Problem nach dem Ausführen von a git fetchund git jemals auftritt, können Sie es git pullaufgrund eines Zusammenführungskonflikts ( sowohl geänderte als auch nicht zusammengeführte Dateien) nicht ausführen. Um Sie frustrierter zu machen, werden Ihnen keine Konfliktmarkierungen in der Datei angezeigt Datei, da sie noch nicht zusammengeführt wurde). Wenn Sie Ihre Arbeit nicht verlieren möchten, können Sie Folgendes tun.

Bühne die Datei.

$ git add filename

Verstecken Sie dann die lokalen Änderungen.

$ git stash

Ziehen Sie Ihr Arbeitsverzeichnis und aktualisieren Sie es

$ git pull

Stellen Sie Ihre lokal geänderte Datei wieder her (Git wird automatisch zusammengeführt, wenn dies möglich ist, andernfalls wird es aufgelöst).

$ git stash pop

Hoffe es wird helfen.

Nimeshka Srimal
quelle
2

Es gibt eine Lösung, auch wenn Sie Ihre lokalen Änderungen nicht entfernen möchten. Korrigieren Sie einfach die nicht zusammengeführten Dateien (von git addoder git remove). Dann mach es git pull.

Preeti A.
quelle
1

Angenommen, Sie möchten alle Änderungen, die Sie vorgenommen haben, wegwerfen, überprüfen Sie zuerst die Ausgabe von git status. Führen Sie für jede Datei, die daneben "nicht zusammengeführt" sagt, aus git add <unmerged file>. Dann folgen Sie mit git reset --hard. Dadurch werden alle lokalen Änderungen außer nicht verfolgten Dateien beseitigt.

Ryan Stewart
quelle
Oh, richtig. Es darf nicht "unmerged" sagen. Es könnte auch "beide modifiziert" oder vielleicht ein oder zwei andere Dinge sagen. Was ist die Ausgabe von git status?
Ryan Stewart
Nachdem ich dies gepostet habe, sage ich dem Teammitglied, es zu versuchen git rebase --abortund git pull --rebasegemäß dem Vorschlag von git
Christian Stewart
1

Ich wurde mit git gelöst, um die nicht zusammengeführte Datei lokal zu entfernen.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Wenn ich danach git commit sende:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Chetabahana
quelle
0

Ryan Stewarts Antwort war fast da. Für den Fall, dass Sie Ihre lokalen Änderungen nicht löschen möchten, können Sie einen Workflow zum Zusammenführen verwenden:

  • Ausführen git status. Sie erhalten eine Liste der nicht zusammengeführten Dateien.
  • Füge sie zusammen (von Hand usw.)
  • Lauf git commit

Git wird nur die Zusammenführungen festschreiben zu einem neuen Commit fest. (In meinem Fall wurden zusätzliche Dateien auf der Festplatte hinzugefügt, die bei diesem Commit nicht berücksichtigt wurden.)

Git betrachtet die Zusammenführung dann als erfolgreich und ermöglicht es Ihnen, vorwärts zu gehen.

Nachtklinge9
quelle