Frage

Ich habe gerade beobachtet etwas merkwürdig git pull, das verstehe ich nicht.

Am Freitag habe ich an einer lokalen Niederlassung. Lassen Sie uns es mybranch nennen. Vor dem Verlassen des Büros schob ich es auf den Ursprung (die mein Github Repo ist). git push origin mybranch

Gestern zu Hause, ich pulled auf meinem Laptop mybranch, tat einige weitere Codierung, und dann wieder auf Github meine Änderungen geschoben (Ursprung).

Jetzt bin ich bei der Arbeit wieder, und versuchte, die Änderungen von gestern zu meiner Arbeit Maschine zu ziehen (ich habe nichts in meinem Arbeitsplatz lokalen Repo ändern über das Wochenende):

git pull origin mybranch

, die einen schnellen Vorlauf merge verursacht, was in Ordnung ist. Ich habe dann eine git status, und es wird gesagt:

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)

Hä? Wie kann es sein 6 voraus Commits, wenn ich nicht einmal über das Wochenende berührt habe, und nur vom Ursprung gezogen? Also habe ich eine git diff origin/mybranch lief und die Differentiale waren genau die 6 Änderungen, die ich aus der Ferne nur gezogen.

ich konnte nur "fix" dies durch Ausführen git fetch origin:

From git@github.com:me/project
af8be00..88b0738  mybranch -> origin/mybranch

Offenbar meinem lokalen Repo einige Referenzobjekte fehlte, aber wie kann das sein? Ich meine, ein Zug ein holen tut schon, und ich habe nicht die Arbeit an irgendetwas außer diesem Zweig, so ein git fetch origin und git fetch origin mybranch sollte das gleiche Ergebnis haben?

Soll ich immer verwenden git pull origin statt git pull origin branchname?

Ich bin verwirrt.

War es hilfreich?

Lösung

git pull ruft git fetch mit den entsprechenden Parametern, bevor die explizit hergeholt Köpfe verschmelzenden (oder, wenn keiner der Fernzweig für merge konfiguriert) in den Stromzweig.

Die Syntax: git fetch <repository> <ref> wo <ref> ohne Doppelpunkt nur einen Zweig Name ist ein ‚One Shot‘, dass holen macht kein Standard-Fernbedienung aller verfolgten Zweige des angegebenen holen, sondern holt nur den benannten Zweig in FETCH_HEAD .

Update: für Git-Versionen seit 1.8.4, wenn es ein Remote-Tracking-Zweig, der die Referee Tracks, die Sie dann der Tracking-Zweig holen gefragt wird nun fetch aktualisiert werden. Diese Änderung wird vorgenommen, speziell um die Verwirrung zu vermeiden, dass das vorherige Verhalten verursacht.

Wenn Sie git pull <repository> <ref> ausführen, FETCH_HEAD wie oben aktualisiert fusionierte dann in der ausgecheckt HEAD aber keine des Standard-Tracking-Zweiges für die Remote-Repository aktualisiert werden (Git <1.8.4). Dies bedeutet, dass lokal es Aussehen wie Sie sind vor der entfernten Zweig, während in der Tat Sie damit dem neuesten Stand sind bis.

Persönlich habe ich immer git fetch von git merge <remote>/<branch> gefolgt, weil ich über Zwang Updates alle Warnungen erhalten, um zu sehen, bevor ich zusammenführen, und ich kann eine Vorschau, was ich verschmelzenden in. Wenn ich ein git pull Bit verwenden mehr als ich, würde ich tun eine einfache git pull ohne Parameter die meiste Zeit auf branch.<branch>.remote und branch.<branch>.merge zu ‚das richtige zu tun.‘

unter Berufung

Andere Tipps

Was git remote -v show kehrt macht, wenn es um die Herkunft?

Wenn Ursprungspunkte auf GitHub, sollte der Status auf dem neuesten Stand sein, auf und nicht vor jeder Remote-Repo. Zumindest mit dem Git1.6.5 Ich verwende für einen schnellen Test.

Wie auch immer, dies zu vermeiden, definiert explizit die Remote-Repo-Master-Zweig:

$ git config branch.master.remote yourGitHubRepo.git

dann ein git pull origin master, gefolgt von einem git status sollte einen sauberen Zustand zurück (nicht vor).
Warum? weil der get origin master holen (im git pull origin master enthalten) nicht nur FETCH_HEAD (wie Charles Bailey aktualisieren würde erklärt in seine Antwort ), aber es wäre auch aktualisieren sie den "Remote-master-Zweig" in Ihrer lokalen Git-Repository.
In diesem Fall Ihr lokaler Master scheint nicht mehr zu sein „ahead“ des Remote-Master.


Ich kann dies testen, mit einem git1.6.5:

Zuerst erstelle ich eine workrepo:

PS D:\git\tests> cd pullahead
PS D:\git\tests\pullahead> git init workrepo
Initialized empty Git repository in D:/git/tests/pullahead/workrepo/.git/
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo firstContent > afile.txt
PS D:\git\tests\pullahead\workrepo> git add -A 
PS D:\git\tests\pullahead\workrepo> git commit -m "first commit"

ich simulieren ein Repo GitHub von einem nackten Repo zu schaffen (eine, die Push von überall empfangen kann)

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github

ich ein modif meiner Arbeits Repo hinzufügen, dass ich auf GitHub Repo-Push (als Remote hinzugefügt)

PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo aModif >> afile.txt
PS D:\git\tests\pullahead\workrepo> git ci -a -m "a modif to send to github"
PS D:\git\tests\pullahead\workrepo> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo> git push github

ich ein Haus Repo erstellen, von GitHub kloniert, in dem ich ein paar Änderungen vornehmen, geschoben GitHub:

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone github homerepo
PS D:\git\tests\pullahead> cd homerepo
PS D:\git\tests\pullahead\homerepo> type afile.txt
firstContent
aModif

PS D:\git\tests\pullahead\homerepo> echo aHomeModif1  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a first home modif"
PS D:\git\tests\pullahead\homerepo> echo aHomeModif2  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a second home modif"
PS D:\git\tests\pullahead\homerepo> git push github

ich dann Klon workrepo für ein erstes Experiment

PS D:\git\tests\pullahead\workrepo4> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo2
Initialized empty Git repository in D:/git/tests/pullahead/workrepo2/.git/
PS D:\git\tests\pullahead> cd workrepo2
PS D:\git\tests\pullahead\workrepo2> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo2> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)

In diesem Repo, git status nicht erwähnt Master geing vor 'origin':

PS D:\git\tests\pullahead\workrepo5> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Das ist aber nur origin nicht Github:

PS D:\git\tests\pullahead\workrepo2> git remote -v show
github  d:/git/tests/pullahead/github (fetch)
github  d:/git/tests/pullahead/github (push)
origin  D:/git/tests/pullahead/workrepo (fetch)
origin  D:/git/tests/pullahead/workrepo (push)

Aber wenn ich die Sequenz in einem Repo wiederholen, die einen Ursprung zu GitHub hat (oder keine Herkunft überhaupt, nur eine Remote ‚Github‘ definiert ist), Status ist sauber:

PS D:\git\tests\pullahead\workrepo2> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo4
PS D:\git\tests\pullahead> cd workrepo4
PS D:\git\tests\pullahead\workrepo4> git remote rm origin
PS D:\git\tests\pullahead\workrepo4> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo4> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
PS D:\git\tests\pullahead\workrepo4> git status
# On branch master
nothing to commit (working directory clean)

Wenn ich nur origin zeigt auf github hatte, status würde für git1.6.5 sauber sein.
Es kann mit einem ‚voraus‘ sein für frühere git Warnung, aber trotzdem, definiert ein git config branch.master.remote yourGitHubRepo.git sollte ausdrücklich der Lage sein, zu kümmern, dass auch bei frühen Versionen von Git.

Sind Sie vorsichtig alle Ihre Fernbedienung (außer origin, die mit Ihrem ursprünglichen Klon kommt) hinzufügen mit git remote add NAME URL? Ich habe diesen Fehler gesehen, als sie gerade auf das git Config hinzugefügt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top