Wie kann ich "git fetch" und "git merge" aus einem Remote-Tracking-Zweig (wie "git pull")?

111

Ich habe einige Remote-Tracking-Zweige in Git eingerichtet, aber ich scheine nie in der Lage zu sein, sie mit dem lokalen Zweig zusammenzuführen, wenn ich sie mit "Git Fetch" aktualisiert habe.

Angenommen, ich habe einen Remote-Zweig namens "an-other-branch". Ich habe das lokal als Tracking-Zweig mit eingerichtet

git branch --track an-other-branch origin/an-other-branch

So weit, ist es gut. Wenn dieser Zweig jedoch aktualisiert wird (normalerweise, indem ich den Computer verschiebe und von diesem Computer aus festschreibe) und ich ihn auf dem ursprünglichen Computer aktualisieren möchte, treten Probleme beim Abrufen / Zusammenführen auf:

git fetch origin an-other-branch
git merge origin/an-other-branch

Immer wenn ich das mache, erhalte ich die Meldung "Bereits aktuell" und nichts wird zusammengeführt.

Ein

git pull origin an-other-branch

aktualisiert es immer wie erwartet.

Auch läuft Git Diff

git diff origin/an-other-branch

zeigt, dass es Unterschiede gibt, also denke ich, dass meine Syntax falsch ist.

Was mache ich falsch?

EDIT [2010-04-09]: Ich habe ein paar Mal nachgesehen und bin definitiv nicht in einem anderen Zweig. Sollte mein 'Git Fetch' gefolgt von einem 'Git Merge' (wie oben gezeigt) genau dasselbe tun wie ein Git Pull? Ich werde einen Workflow erhalten, der die Ergebnisse eines Git-Status usw. zeigt.

Kaybenleroll
quelle

Antworten:

170

Sie holen keinen Zweig, Sie holen eine ganze Fernbedienung:

git fetch origin
git merge origin/an-other-branch
Gareth
quelle
8
Weitere Details: git fetch origin an-other-branchSpeichert das abgerufene Trinkgeld FETCH_HEAD, jedoch nicht origin/an-other-branch(dh den üblichen "Remote Tracking Branch"). Man könnte es also tun git fetch origin an-other-branch && git merge FETCH_HEAD, aber es zu tun, wie @Gareth sagt, ist besser (oder einfach Git Pull verwenden ).
Chris Johnsen
Wenn der Ursprung also 1000 Zweige hat, würden Sie für alle einen entfernten Zweig haben?
Gauthier
4
Sicher. Wenn ich ein Remote-Repository mit 1000 Zweigen zu meinem hinzugefügt habe und frage, welche Zweige das Remote hat, ist es verdammt noch mal besser , mir alle 1000 zu geben
Gareth
wird git merge origin/an-other-branchverschmelzen origin/an-other-branchin allen lokalen Niederlassungen , die es gesetzt verfolgen? Wie kann ich nur eine lokale Niederlassung zusammenführen?
Amphibient
1
Was macht also git pull(ohne Argumente) - welcher Zweig wird zusammengeführt? Führt es den Remote-Tracking-Zweig zusammen, der dem aktuellen Zweig entspricht?
Die rote Erbse
69

Nur einen Zweig auswählen: fetch/ merge vs. pull

Oft wird empfohlen, "Abrufen" von "Zusammenführen" zu trennen. Sie sagen stattdessen:

    git pull remoteR branchB

mach das:

    git fetch remoteR
    git merge remoteR branchB

Was sie tun , nicht zu erwähnen ist , dass ein solcher Befehl holen wird holen tatsächlich alle Zweige von dem entfernten Repo, das ist nicht , was das Pull - Befehl tut. Wenn Sie Tausende von Zweigen im Remote-Repo haben, aber nicht alle sehen möchten, können Sie diesen undurchsichtigen Befehl ausführen:

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

Das ist natürlich lächerlich schwer zu merken. Wenn Sie also wirklich vermeiden möchten, alle Zweige .git/configabzurufen , ist es besser, Ihre wie in ProGit beschrieben zu ändern.

Huh?

Die beste Erklärung für all dies finden Sie in Kapitel 9-5 von ProGit, Git Internals - The Refspec ( oder über Github ). Das ist über Google erstaunlich schwer zu finden.

Zunächst müssen wir einige Begriffe klären. Für die Fernverfolgung von Zweigen sind normalerweise drei verschiedene Zweige zu beachten:

  1. Der Zweig auf dem Remote-Repo: refs/heads/branchBinnerhalb des anderen Repos
  2. Ihr Remote-Tracking-Zweig : refs/remotes/remoteR/branchBin Ihrem Repo
  3. Ihre eigene Filiale: refs/heads/branchBin Ihrem Repo

Remote-Tracking-Zweige (in refs/remotes) sind schreibgeschützt. Sie ändern diese nicht direkt. Sie ändern Ihren eigenen Zweig und drücken dann auf den entsprechenden Zweig im Remote-Repo. Das Ergebnis spiegelt sich refs/remoteserst nach einem entsprechenden Pull oder Fetch in Ihrem wider . Diese Unterscheidung war für mich auf den Git-Manpages schwer zu verstehen, hauptsächlich weil der lokale Zweig ( refs/heads/branchB) den Remote-Tracking-Zweig bei der .git/configDefinition "verfolgen" soll branch.branchB.remote = remoteR.

Stellen Sie sich 'refs' als C ++ - Zeiger vor. Physisch sind es Dateien, die SHA-Digests enthalten, aber im Grunde sind sie nur Zeiger auf den Commit-Baum. git fetchfügt Ihrem Commit-Baum viele Knoten hinzu, aber wie Git entscheidet, welche Zeiger verschoben werden sollen, ist etwas kompliziert.

Wie in einer anderen Antwort erwähnt , auch nicht

    git pull remoteR branchB

Noch

    git fetch remoteR branchB

würde sich bewegen refs/remotes/branches/branchB, und letztere kann sich sicherlich nicht bewegen refs/heads/branchB. Beide bewegen sich jedoch FETCH_HEAD. (Sie können cateine dieser Dateien in .git/sehen , wenn sie sich ändern.) Und git mergebeziehen FETCH_HEAD, während Einstellung MERGE_ORIG, usw.

cdunn2001
quelle
1
Ist Ihnen bewusst, dass Ihr Link zu Git Internals ein Link zu derselben Frage ist?
Shahbaz
9

Sind Sie sicher, dass Sie sich an-other-branchbeim Zusammenführen auf der lokalen Ebene befinden?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

Die andere Erklärung :

Alle Änderungen aus dem Zweig, den Sie zusammenführen möchten, wurden bereits mit dem Zweig zusammengeführt, in dem Sie sich gerade befinden.
Insbesondere bedeutet dies, dass der Zweig, den Sie zusammenführen möchten, ein übergeordneter Zweig Ihres aktuellen Zweigs ist

Wenn Sie dem Remote-Repo um ein Commit voraus sind, ist das Remote-Repo veraltet, nicht Sie.

Wenn dies in Ihrem Fall git pullfunktioniert, bedeutet dies nur, dass Sie nicht auf dem richtigen Zweig sind.

VonC
quelle
3

Git Pull ist eigentlich ein Combo-Tool: Es führt Git Fetch (Abrufen der Änderungen) und Git Merge (Zusammenführen mit Ihrer aktuellen Kopie) aus.

Sind Sie sicher, dass Sie sich in der richtigen Branche befinden?

RDL
quelle
Ich denke, das OP ist in diff. Zweig, passiert mir.
Chaklader Asfak Arefe
1

Dies sind die Befehle:

git fetch origin
git merge origin/somebranch somebranch

Wenn Sie dies in der zweiten Zeile tun:

git merge origin somebranch

Es wird versucht, den lokalen Master in Ihrem aktuellen Zweig zusammenzuführen.

Die Frage, wie ich es verstanden habe, war, dass Sie bereits lokal abgerufen wurden und jetzt Ihren Zweig mit dem neuesten Zweig desselben Zweigs zusammenführen möchten .

user1524957
quelle