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.
git fetch origin an-other-branch
Speichert das abgerufene TrinkgeldFETCH_HEAD
, jedoch nichtorigin/an-other-branch
(dh den üblichen "Remote Tracking Branch"). Man könnte es also tungit fetch origin an-other-branch && git merge FETCH_HEAD
, aber es zu tun, wie @Gareth sagt, ist besser (oder einfach Git Pull verwenden ).git merge origin/an-other-branch
verschmelzenorigin/an-other-branch
in allen lokalen Niederlassungen , die es gesetzt verfolgen? Wie kann ich nur eine lokale Niederlassung zusammenführen?git pull
(ohne Argumente) - welcher Zweig wird zusammengeführt? Führt es den Remote-Tracking-Zweig zusammen, der dem aktuellen Zweig entspricht?Nur einen Zweig auswählen:
fetch
/merge
vs.pull
Oft wird empfohlen, "Abrufen" von "Zusammenführen" zu trennen. Sie sagen stattdessen:
mach das:
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:
Das ist natürlich lächerlich schwer zu merken. Wenn Sie also wirklich vermeiden möchten, alle Zweige
.git/config
abzurufen , 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:
refs/heads/branchB
innerhalb des anderen Reposrefs/remotes/remoteR/branchB
in Ihrem Reporefs/heads/branchB
in Ihrem RepoRemote-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 sichrefs/remotes
erst 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/config
Definition "verfolgen" sollbranch.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 fetch
fü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
Noch
würde sich bewegen
refs/remotes/branches/branchB
, und letztere kann sich sicherlich nicht bewegenrefs/heads/branchB
. Beide bewegen sich jedochFETCH_HEAD
. (Sie könnencat
eine dieser Dateien in.git/
sehen , wenn sie sich ändern.) Undgit merge
beziehenFETCH_HEAD
, während EinstellungMERGE_ORIG
, usw.quelle
Sind Sie sicher, dass Sie sich
an-other-branch
beim Zusammenführen auf der lokalen Ebene befinden?Die andere Erklärung :
Wenn dies in Ihrem Fall
git pull
funktioniert, bedeutet dies nur, dass Sie nicht auf dem richtigen Zweig sind.quelle
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?
quelle
Dies sind die Befehle:
Wenn Sie dies in der zweiten Zeile tun:
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 .
quelle