Wie führe ich „git fetch“ und „git merge“ von einem Remote-Tracking-Zweig aus (wie „git pull“)

Lesezeit: 5 Minuten

Wie fuhre ich „git fetch und „git merge von einem
kaybenleroll

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, nachdem ich sie mit „git fetch“ aktualisiert habe.

Angenommen, ich habe einen Remote-Zweig mit dem Namen „an-other-branch“. Ich habe das lokal als Tracking-Zweig eingerichtet

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

So weit, ist es gut. Aber wenn dieser Zweig aktualisiert wird (normalerweise, indem ich die Maschine verschiebe und von dieser Maschine übertrage) und ich ihn auf der ursprünglichen Maschine aktualisieren möchte, bekomme ich Probleme mit Abrufen/Zusammenführen:

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

Immer wenn ich das tue, bekomme ich eine ‘Bereits aktuell’-Meldung und nichts wird zusammengeführt.

Allerdings, ein

git pull origin an-other-branch

aktualisiert es immer so, wie Sie es erwarten würden.

Außerdem läuft git diff

git diff origin/an-other-branch

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

Was mache ich falsch?

BEARBEITEN [2010-04-09]: Ich habe ein paar Mal nachgesehen, und ich 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 bekomme einen Workflow, der die Ergebnisse eines Git-Status usw. zeigt.

Sie holen keinen Zweig, Sie holen eine ganze Fernbedienung:

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

  • Mehr Details: git fetch origin an-other-branch speichert das geholte Trinkgeld FETCH_HEAD, aber nicht origin/an-other-branch (dh der übliche ‘Remote-Tracking-Zweig’). Könnte man also machen git fetch origin an-other-branch && git merge FETCH_HEAD, aber es ist besser, es so zu machen, wie @Gareth sagt (oder einfach verwenden git ziehen).

    – Chris Johnsen

    10. April 10 um 5:44 Uhr


  • Wenn Origin also 1000 Zweige hat, würden Sie für alle einen Remote-Zweig haben?

    – Gauthier

    8. Juni 10 um 15:41 Uhr

  • Sicher. Wenn ich ein Remote-Repository mit 1000 Branches zu meinem hinzugefügt habe und frage, welche Branches die Remote hat, ist es verdammt gut besser Gib mir alle 1000

    – Gareth

    11. Juni 10 um 19:14 Uhr

  • Wille git merge origin/an-other-branch verschmelzen origin/an-other-branch in alle lokalen Niederlassungen, die darauf eingestellt sind, es zu verfolgen? Wie kann ich in nur einem lokalen Zweig zusammenführen?

    – Amphibie

    4. Februar 14 um 16:37 Uhr

  • Also was macht git pull (ohne Argumente) tun — welcher Zweig wird zusammengeführt? Führt es den entsprechenden Remote-Tracking-Zweig zusammen Strom Ast?

    – Die rote Erbse

    2. Dezember 15 um 2:43 Uhr

Wie fuhre ich „git fetch und „git merge von einem
cdunn2001

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

Die Leute raten Ihnen oft, “Abrufen” von “Zusammenführen” zu trennen. Sie sagen stattdessen:

    git pull remoteR branchB

mach das:

    git fetch remoteR
    git merge remoteR branchB

Was sie nicht erwähnen, ist, dass ein solcher Abrufbefehl tatsächlich abruft alle verzweigt sich vom entfernten Repo, das heißt nicht was dieser Pull-Befehl tut. Wenn Sie Tausende von Branches im Remote-Repository haben, aber nicht alle sehen möchten, können Sie diesen obskuren Befehl ausführen:

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

Natürlich ist es lächerlich schwer, sich das zu merken, wenn Sie also wirklich vermeiden wollen, alle Zweige zu holen, ist es besser, Ihre zu ändern .git/config wie in ProGit beschrieben.

Häh?

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

Zunächst müssen wir einige Begrifflichkeiten klären. Für das Remote-Branch-Tracking gibt es normalerweise 3 verschiedene Branches, die Sie beachten sollten:

  1. Der Zweig auf dem Remote-Repo: refs/heads/branchB im anderen Repo
  2. Deine Remote-Tracking-Zweig: refs/remotes/remoteR/branchB in deine Repo
  3. Ihre eigene Filiale: refs/heads/branchB Innerhalb deine Repo

Remote-Tracking-Zweige (in refs/remotes) sind schreibgeschützt. Sie ändern diese nicht direkt. Sie ändern Ihren eigenen Branch und pushen dann zum entsprechenden Branch im Remote-Repo. Das Ergebnis spiegelt sich nicht in Ihrem wider refs/remotes bis nach einem entsprechenden Ziehen oder Holen. Diese Unterscheidung war für mich von den Git-Manpages aus schwer zu verstehen, hauptsächlich weil der lokale Zweig (refs/heads/branchB) soll den Remote-Tracking-Zweig “verfolgen”, wenn .git/config definiert branch.branchB.remote = remoteR.

Stellen Sie sich ‘refs’ als C++-Zeiger vor. Physikalisch sind sie Dateien, die SHA-Digests enthalten, aber im Grunde sind sie nur Zeiger in 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

    git pull remoteR branchB

Noch

    git fetch remoteR branchB

würde umziehen refs/remotes/branches/branchB, und letzteres kann sich sicherlich nicht bewegen refs/heads/branchB. Beide bewegen sich jedoch FETCH_HEAD. (Sie können cat jede dieser Dateien darin .git/ um zu sehen, wann sie sich ändern.) Und git merge wird darauf verweisen FETCH_HEAD, während der Einstellung MERGE_ORIG, etc.

  • Ist Ihnen bewusst, dass Ihr Link zu Git Internals ein Link zu derselben Frage ist?

    – Shahbaz

    11. November 11 um 18:47 Uhr

  • Dies hat sich seit Git 1.8.4 geändert. Wenn es nun einen Remote-Tracking-Zweig gibt, der die Referenz verfolgt, die Sie abrufen möchten, wird der Tracking-Zweig ebenfalls durch den Abruf aktualisiert.

    – TomCZ

    19. Oktober 21 um 18:13 Uhr

Wie fuhre ich „git fetch und „git merge von einem
VonC

Bist du sicher, dass du im Lokal bist an-other-branch wenn du fusionierst?

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 zusammenzuführen versuchen, wurden bereits mit dem Zweig zusammengeführt, in dem Sie sich gerade befinden.
Genauer gesagt bedeutet dies, dass der Zweig, den Sie zusammenzuführen versuchen, ein übergeordneter Zweig Ihres aktuellen Zweigs ist

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

Aber in Ihrem Fall, wenn git pull funktioniert, das bedeutet nur, dass Sie nicht auf dem richtigen Zweig sind.

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 im richtigen Zweig befinden?

das 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 versuchen, den lokalen Master mit Ihrem aktuellen Zweig zusammenzuführen.

Die Frage, so wie ich es verstanden habe, war Sie bereits vor Ort geholt und wollen jetzt Ihre Filiale auf den neusten Stand bringen gleich Ast.

.

498340cookie-checkWie führe ich „git fetch“ und „git merge“ von einem Remote-Tracking-Zweig aus (wie „git pull“)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy