Ich habe gerade etwas Seltsames beobachtet git pull
, das ich nicht verstehe.
Am Freitag habe ich in einer lokalen Niederlassung gearbeitet. Nennen wir es mybranch
. Bevor ich das Büro verließ, schob ich es zum Ursprung (das ist mein Github-Repo) : git push origin mybranch
.
Gestern zu Hause habe ich pull
mybranch auf meinen Laptop übertragen, etwas mehr programmiert und dann meine Änderungen wieder auf github (origin) verschoben.
Jetzt bin ich wieder bei der Arbeit und habe versucht, die Änderungen von gestern auf meine Arbeitsmaschine zu übertragen (ich habe am Wochenende nichts am lokalen Repo meines Arbeitsplatzes geändert):
git pull origin mybranch
das führte zu einem schnellen Vorlauf, was in Ordnung ist. Ich habe dann ein gemacht git status
, und es sagte:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
Huh? Wie kann es sein, dass ich 6 Commits voraus bin, wenn ich es am Wochenende nicht einmal angefasst habe UND nur vom Ursprung abgezogen habe? Also habe ich a ausgeführt git diff origin/mybranch
und die Unterschiede waren genau die 6 Änderungen, die ich gerade von der Fernbedienung gezogen habe.
Ich konnte dies nur durch Ausführen "beheben" git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Anscheinend fehlten meinem lokalen Repo einige Referenzobjekte, aber wie kann das sein? Ich meine, ein Pull holt schon und ich habe an nichts anderem als an diesem Zweig gearbeitet, also sollte a git fetch origin
und git fetch origin mybranch
das gleiche Ergebnis haben?
Soll ich immer git pull origin
statt verwenden git pull origin branchname
?
Ich bin verwirrt.
quelle
git push
scheint es auch zu lösen (Berichterstattung "alles auf dem neuesten Stand").git config --get-regexp br.*
kann Ihnen sagen, ob Ihre Konfiguration einen lokalen Zweig hat, der einen anderen Zweig verfolgtgit config branch.master.remote yourGitHubRepo.git
Ihr workRepo eingeben und (beim nächsten Malgit pull origin
) überprüfen, ob der Status mit einer Vorauswarnung erhalten bleibt?git remote show origin
zeigt mir, dass origin auf mein GitHub-Repository verweist, also sollte das okay sein, denke ich?Your branch is ahead
Warnmeldung angezeigt wirdgit pull
, müssen Sie zunächst auch den Remote-Namen für einen Zweig definieren . Daher mein Vorschlag:git config branch.master.remote yourGitHubRepo.git
Geben Sie agit pull
und a eingit status
und prüfen Sie, ob das Problem weiterhin besteht.Antworten:
git pull
Ruftgit fetch
mit den entsprechenden Parametern auf, bevor die explizit abgerufenen Köpfe (oder, falls keine vorhanden sind, der für das Zusammenführen konfigurierte Remote-Zweig) mit dem aktuellen Zweig zusammengeführt werden.Die Syntax:
git fetch <repository> <ref>
Wo<ref>
nur ein Zweigname ohne Doppelpunkt steht, ist ein One-Shot-Abruf, bei dem nicht alle verfolgten Zweige der angegebenen Fernbedienung standardmäßig abgerufen werden, sondern nur der benannte Zweig abgerufen wirdFETCH_HEAD
.Aktualisieren: Wenn es für Git-Versionen seit 1.8.4 einen Remote-Tracking-Zweig gibt, der den Ref verfolgt, den Sie abrufen möchten, wird der Tracking-Zweig jetzt von aktualisiert
fetch
. Diese Änderung wurde speziell vorgenommen, um die Verwirrung zu vermeiden, die das vorherige Verhalten verursacht hat.Wenn Sie ausführen
git pull <repository> <ref>
,FETCH_HEAD
wird es wie oben aktualisiert und dann in IhrHEAD
ausgechecktes System zusammengeführt , aber keiner der Standard-Tracking-Zweige für das Remote-Repository wird aktualisiert (Git <1.8.4). Dies bedeutet, dass es lokal sieht aus wie Sie sind vor der entfernten Zweig, während in der Tat sind Sie mit ihm auf dem Laufenden.Persönlich
git fetch
folge ich immer,git merge <remote>/<branch>
weil ich vor dem Zusammenführen Warnungen vor erzwungenen Aktualisierungen sehe und eine Vorschau meiner Zusammenführung anzeigen kann. Wenn ichgit pull
etwas mehr als ich verwenden würde, würde ich eine Ebenegit pull
ohne die meisten Parameter erstellen der Zeit, sich auf das Richtige zu verlassenbranch.<branch>.remote
und esbranch.<branch>.merge
zu tun.quelle
git fetch
nach einergit pull <repository> <ref>
Behebung das Problem behoben werden, da der Abruf die Standard-Tracking-Zweige aktualisieren würde? Auch danke für diese Antwort, diegit fetch
gefolgt vongit merge origin/master master
.Was gibt es
git remote -v show
zurück, wenn es um die Herkunft geht?Wenn origin auf github zeigt, sollte der Status aktuell sein und nicht vor einem Remote-Repo. Zumindest mit dem Git1.6.5 verwende ich für einen schnellen Test.
Um dies zu vermeiden, definieren Sie das Remote-Repo des Hauptzweigs explizit:
dann sollte a
git pull origin master
, gefolgt von agit status
, einen sauberen Status zurückgeben (kein Voraus).Warum? weil der get fetch origin master (im git pull origin master enthalten) nicht nur aktualisiert würde
FETCH_HEAD
(wie Charles Bailey in seiner Antwort erklärt ), sondern auch den "remote master branch" in Ihrem lokalen Git-Repository.In diesem Fall scheint Ihr lokaler Master dem Remote-Master nicht mehr "voraus" zu sein.
Ich kann dies mit einem git1.6.5 testen:
Zuerst erstelle ich ein Workrepo:
Ich simuliere ein GitHub-Repo, indem ich ein nacktes Repo erstelle (eines, das von überall Push erhalten kann).
Ich füge meinem Arbeits-Repo ein Modif hinzu, das ich zum Github-Repo drücke (als Fernbedienung hinzugefügt).
Ich erstelle ein von GitHub geklontes Home-Repo, in dem ich einige Änderungen vornehme, die an GitHub gesendet werden:
Ich klone dann Workrepo für ein erstes Experiment
In diesem Repo erwähnt der Git-Status das Master-Geing vor '
origin
':Aber das ist nur
origin
kein Github:Aber wenn ich die Sequenz in einem Repo wiederhole, das einen Ursprung für Github hat (oder überhaupt keinen Ursprung, nur einen entfernten 'Github' definiert), ist der Status sauber:
Wenn ich nur
origin
darauf zeigen würdegithub
,status
wäre sauber für git1.6.5.Es kann mit einer "Voraus" -Warnung für frühere Git sein, aber auf jeden
git config branch.master.remote yourGitHubRepo.git
Fall sollte eine explizit definierte in der Lage sein, dies auch mit frühen Versionen von Git zu erledigen.quelle
git remote show origin
.Achten Sie darauf, alle Ihre Fernbedienungen (außer
origin
denen, die mit Ihrem ursprünglichen Klon geliefert werden) mit hinzuzufügengit remote add NAME URL
? Ich habe diesen Fehler gesehen, als sie gerade zur Git-Konfiguration hinzugefügt wurden.quelle
git checkout -b mybranch origin/mybranch
. Laut der Manpage von git-branch ist der Ursprung / die Mybranch der Startpunkt und außerdem heißt es für --track: "... Verwenden Sie diese Option, wenn Sie immer von demselben Upstream-Zweig in den neuen Zweig ziehen, und Wenn Sie "git pull <Repository> <Refspec>" nicht explizit verwenden möchten. Dieses Verhalten ist die Standardeinstellung, wenn der Startpunkt ein Remote-Zweig ist. "