2013-02-28 14 views
61

Ich habe alle ähnliche Fragen zu diesem Thema gelesen; es scheint, dass keine der folgenden gearbeitet haben:Git Pull ist nicht möglich, nicht zusammengeführte Dateien

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

jede Kombination Fast, Änderungen stashing und aus dem Repository, Ergebnisse in unmergable Dateien ziehen. Ich möchte alle lokalen Änderungen verwerfen und nur die Fernbedienung verwenden, aber ich kann 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 

auch nicht funktionierte.

Mehr Infos

Es gibt eine lokale begehen, und die stromaufwärts ein und hat begehen. Ich habe also versucht git pull --rebase, aber es funktioniert immer noch nicht richtig ... Das gibt mir Fehler - "wegen eines ungelösten Konflikts". Wenn ich git stash, git reset --hard HEAD, git pull --rebase tun, erhalte ich die Fehlermeldung "Pull ist nicht möglich, unmerged Änderungen ..."

Antwort

146

Sagen Sie den Remote-origin und die Verzweigung ist master, und sagen Sie bereits haben master ausgecheckt ist, können folgende versuchen:

git fetch origin 
git reset --hard origin/master 

Diese im Grunde nimmt nur den aktuellen Zweig und verweist er auf die HEAD von der entfernte Zweig.

WARNUNG: Wie in den Kommentaren erwähnt, dies wird Ihre lokale Änderungen wegzuwerfen und mit überschreiben, was über den Ursprung ist.

Oder können Sie die Sanitär-Befehle verwenden, im Wesentlichen das gleiche zu tun:

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

EDIT: ich kurz erläutern möchte, warum das funktioniert.Der Ordner .git kann die Commits für eine beliebige Anzahl von Repositorys speichern. Da der Commit-Hash tatsächlich eine Verifizierungsmethode für den Inhalt des Commits ist und nicht nur ein zufällig generierter Wert, wird er verwendet, um Commit-Sätze zwischen Repositories abzugleichen.

Ein Zweig ist nur ein benannter Zeiger auf einen gegebenen 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 eine Hash-Hinweis auf eine Festschreibung:

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

Diese alle für den internen git Speichermechanismus sind, und arbeitet unabhängig von dem Arbeitsverzeichnis .

git reset --hard origin/master 

git wird zeigen den aktuellen Zweig auf dem gleichen Hash-Wert, Herkunft/Master Punkte: die folgenden Dadurch. Dann wird das Arbeitsverzeichnis zwangsweise so geändert, dass es der Dateistruktur/dem Inhalt dieses Hashs entspricht.

dies bei der Arbeit zu sehen, gehen Sie vor und versuchen Sie folgendermaßen vor:

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 
+0

kann ich nicht testen Das also habe ich keine Ahnung, ob das funktioniert - aber ich habe für eine gute Lösung Upvoted –

+3

@timothyov Das stimmt, aber basierend auf der Frage, die ich fühlte, dass das impliziert wurde. –

+1

Von der kürzlich genehmigten Änderung die massive Warnung am Anfang hinzufügen, nur um darauf hinzuweisen, dass es bereits erwähnt: "Dann ändert [git] zwanghaft das Arbeitsverzeichnis, um die Dateistruktur/Inhalte bei diesem Hash anzupassen." Aber rate mal, das war nicht explizit genug. –

1

Angenommen, Sie Änderungen wegzuwerfen wollen Sie zuerst die Ausgabe von git status überprüfen. Führen Sie git add <unmerged file> für jede Datei aus, die "Unmerged" daneben angibt. Dann folgen Sie mit git reset --hard. Dadurch werden alle lokalen Änderungen außer für nicht verfolgte Dateien entfernt.

+0

Hinzugefügt weitere Informationen, das funktioniert noch nicht ganz richtig –

+0

Oh, richtig. Es darf nicht "unmerged" heißen. Es könnte auch sagen "beide modifiziert" oder vielleicht ein oder zwei andere Dinge. Was ist die Ausgabe von 'git status'? –

+0

http://prntscr.com/ufyqw –

3

gelöst, die folgende Befehlssatz:

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

Der Trick ist, um die Änderungen zu rebase ... Wir einige Mühe hatte Rebasing eine triviale begehen, und so einfach wir ausgelassen mit git rebase --skip (nach dem Kopieren der Dateien).

1

ich mit git entfernen Sie die unmerged Datei lokal gelöst wurde.

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

Wenn ich git senden begehen danach:

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

Ryan Stewart Antwort war fast da. In dem Fall, dass Sie tatsächlich nicht wollen Ihre lokalen Änderungen löschen, gibt es einen Workflow Sie zusammenführen können:

  • Run git status. Es wird Ihnen eine Liste der nicht zusammengeführten Dateien geben.
  • kombiniere sie (von Hand, etc.)
  • Run git commit

Git einen neuen nur der Merges in begeht begehen wird. (In meinem Fall hatte ich zusätzliche Dateien auf dem Datenträger hinzugefügt, die nicht in diesem Commit zusammengefasst wurden.)

Git berücksichtigt dann die Zusammenführung erfolgreich und ermöglicht es Ihnen, weiterzugehen.

0

Wenn Sie jemals wird man dieses Problem nicht erhalten, nachdem ein git fetch und dann git laufen passieren zu ermöglichen git pull wegen eines merge Konflikt (beide modifizierte/unmerged Dateien, laufen und Sie mehr frustriert zu machen, es gewann‘ t zeigen Sie irgendwelche Konfliktmarker in der Datei an, da sie noch nicht zusammengefügt sind). Wenn Sie Ihre Arbeit nicht verlieren möchten, können Sie Folgendes tun.

stage die Datei.

$ git add filename 

dann verstauen Sie die lokalen Änderungen.

$ git stash 

ziehen und aktualisieren Sie Ihre Arbeitsverzeichnis

$ git pull 

Wiederherstellung Ihrer lokalen geänderte Datei (git automatisch zusammenführen, wenn er kann, sonst ist es zu beheben)

$ git stash pop 

Hoffe, es hilft.

Verwandte Themen