Wie kann ich und 'git merge' von einem Remote-Tracking-Branch (wie 'git pull') 'Git holen'
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.
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:
- Die Filiale auf der Remote-Repo:
refs/heads/branchB
innerhalb des anderen Repo - Ihre Remote-Tracking-Zweig :
refs/remotes/remoteR/branchB
in Ihre Repo - 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 istWenn 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.