Frage

Ich habe einige Remote-Tracking-Niederlassungen in Git einrichten, aber ich scheine nie in der Lage sein, sie in der lokale Niederlassung zu fusionieren, sobald ich sie mit aktualisiert ‚Git holen‘.

Zum Beispiel nehme ich an Remote-Zweig habe ‚eine-anderen-Zweig‘ genannt. Ich habe, dass lokal als Tracking-Zweig nach oben mit

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

So weit, so gut. Aber wenn dieser Zweig aktualisiert wird (in der Regel von mir Maschine bewegt und von dieser Maschine commiting), und ich möchte es auf der ursprünglichen Maschine aktualisieren, ich laufe in Schwierigkeiten mit Abruf- / Merge:

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

Jedes Mal, wenn ich das tue, ich eine bekommen 'Bereits up-to-date' -Nachricht und nichts verschmilzt.

Allerdings a

git pull origin an-other-branch

immer aktualisiert es wie man erwarten würde.

Auch läuft git diff

git diff origin/an-other-branch

zeigt, dass es Unterschiede gibt, so glaube ich, dass ich meine Syntax falsch haben.

Was mache ich falsch?

EDIT [2010-04-09]: Ich habe ein paar Mal überprüft, und ich bin definitiv nicht auf einem anderen Zweig. Sollte mein ‚Git holen‘, gefolgt von einem ‚git merge‘ (wie oben dargestellt) tun genau die gleiche Sache wie ein Git-Pull? Ich werde einige Workflow erhalten die Ergebnisse eines git Status usw. zeigt.

War es hilfreich?

Lösung

Sie holen nicht einen Zweig, Sie eine komplette Fern holen:

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

Andere Tipps

nur einen Zweig wählen. fetch / merge vs pull

Menschen beraten Sie oft zu trennen „Abrufen“ von „Fusion“. Sie sagen, statt dies:

    git pull remoteR branchB

Sie folgendermaßen vor:

    git fetch remoteR
    git merge remoteR branchB

Was sie nicht erwähnt ist, dass ein solcher Befehl tatsächlich holen holen wird alle zweigt von der Remote-Repo, das ist nicht , was das Pull-Befehl tut. Wenn Sie Tausende von Filialen in der Remote-Repo, aber Sie wollen nicht, um sie alle sehen, 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, das ist lächerlich schwer zu merken, wenn Sie also wirklich alle Zweige vermeiden wollen holen, ist es besser, Ihre .git/config zu verändern, wie in ProGit beschrieben.

Hä?

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

Zuerst müssen wir einige Begriffe klären. Für die Fern-Zweig-Tracking gibt es typischerweise drei verschiedene Zweige sich bewusst sein:

  1. Die Filiale auf der Remote-Repo: refs/heads/branchB innerhalb des anderen Repo
  2. Ihre Remote-Tracking-Zweig : refs/remotes/remoteR/branchB in Ihre Repo
  3. Ihre eigene Niederlassung: refs/heads/branchB innerhalb von Ihre Repo

Remote-Tracking-Zweige (in refs/remotes) sind schreibgeschützt. Sie ändern nicht die direkt. Sie ändern Ihren eigenen Zweig, und dann drücken Sie auf den entsprechenden Zweig am entfernten Repo. Das Ergebnis wird erst nach einer entsprechenden Pull- oder holen in Ihrem refs/remotes wider. Diese Unterscheidung war schwierig für mich, von den git Mann-Seiten, vor allem, weil die lokale Niederlassung (refs/heads/branchB) auf „Track“ die Fernverfolgung Zweig, wenn .git/config definiert branch.branchB.remote = remoteR wird gesagt, zu verstehen.

Denken Sie an 'refs' als C ++ Zeiger. Körperlich sind sie Dateien SHA-Digests enthalten, aber im Grunde sind sie nur Zeiger in den Baum zu begehen. git fetch fügt viele Knoten zu Ihrem Commit-Baum, aber wie git entscheidet, welche Zeiger zu bewegen ist ein bisschen kompliziert.

Wie bereits erwähnt in eine andere Antwort , weder

    git pull remoteR branchB

oder

    git fetch remoteR branchB

würde refs/remotes/branches/branchB bewegen, und dieser kann sicherlich nicht refs/heads/branchB bewegen. Doch beide bewegen FETCH_HEAD. (Sie können eine dieser Dateien innerhalb cat .git/ zu sehen, wenn sie sich ändern.) Und git merge zu FETCH_HEAD beziehen, während Einstellung MERGE_ORIG, etc.

Sind Sie sicher, dass Sie auf dem lokalen an-other-branch sind, wenn Sie zusammenführen?

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

Die andere Erklärung :

  

alle Änderungen aus der Branche Sie merge sind versucht haben fusioniert bereits auf dem Zweig sind Sie aktuell.
  Genauer gesagt bedeutet dies, dass der Zweig Sie merge sind versuchen, ein Elternteil des aktuellen Zweig ist

     

Wenn Sie vor dem Remote-Repo sind durch eine begehen, dann ist es die Remote-Repo, die auf dem neuesten Stand ist out, nicht Sie.

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

Git-Pull ist eigentlich ein Combo-Tool: es läuft git zu holen (die Änderungen bekommen) und git merge (sie mit Ihrer aktuellen Kopie verschmelzenden)

Sind Sie sicher, dass Sie auf dem richtigen Zweig sind?

das sind die Befehle:

git fetch origin
git merge origin/somebranch somebranch

Wenn Sie dies tun, in der zweiten Zeile:

git merge origin somebranch

es wird versuchen, den lokalen Master in Ihrem aktuellen Zweig zu fusionieren.

Die Frage, wie ich es verstanden habe, wurde geholt Sie bereits vor Ort und wollen nun Ihre Branche auf die neueste der gleichen Zweig zusammenführen.

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