2009-11-10 13 views
404

Ich habe ein Projekt mit mehreren Zweigen. Ich habe sie auf GitHub geschoben, und jetzt, da jemand anders an ihnen arbeitet, muss ich von GitHub ziehen. Es funktioniert gut in Master. Aber sag ich habe einen Zweig xyz. Wie kann ich Zweig xyz von GitHub ziehen und es in den Zweig xyz auf meinem localhost zusammenführen?Git ziehen einen bestimmten Zweig von GitHub

Ich habe eigentlich meine Antwort hier: Push and pull branches in Git

Aber ich erhalte eine Fehlermeldung und etwas von „nicht schnell vorwärts“ „[abgelehnt]!“.

Irgendwelche Vorschläge?

+3

Repo hinzufügen, was ist der eigentliche Befehl, den Sie laufen werden? –

+1

Es ist Fetch, der mit 'Non Fast Forward' Nachricht fehlschlagen kann. Haben Sie den Remote-Tracking-Zweig (Ursprung/xyz) geändert oder wurde der Zweig im Remote-Repository zurückgespult/neu geschrieben? Sie müssen "git fetch ursprung - force" verwenden, aber lesen Sie die Dokumentation, bevor Sie das tun. –

Antwort

466

Aber ich bekomme ein Fehler "! [abgelehnt]" und etwas über "nicht schnell vorwärts"

Das liegt daran, dass Git die Änderungen aus den Zweigen nicht in Ihren aktuellen Master zusammenführen kann. Nehmen wir an, Sie haben den Zweig master ausgecheckt und möchten in den Remote-Zweig other-branch einbinden. Wenn Sie dies tun:

$ git pull origin other-branch 

Git ist dies im Grunde tun:

$ git fetch origin other-branch && git merge other-branch 

Das heißt, ein pull ist nur eine von einem merge gefolgt fetch. Wenn jedoch pull -ing, wird Git nur merge other-branchwenn es kann eine Schnellvorlauf Merge durchführen.Ein Schnellvorlauf Merge ist eine Zusammenführung, in der der Kopf des Zweigs, in den Sie versuchen zu verschmelzen, ein direkter Abkömmling des Kopfes der Branche ist, die Sie zusammenführen möchten. Zum Beispiel, wenn Sie diese Geschichte Baum, dann other-branch Fusion würde in einem vorspulen merge führen:

O-O-O-O-O-O 
^  ^
master other-branch 

Dies würde jedoch nicht sein ein Vorspulen merge:

v master 
O-O-O 
\ 
\-O-O-O-O 
     ^other-branch 

Um Ihr Problem zu lösen, zuerst holt den Remote-Zweig:

$ git fetch origin other-branch 

ich dann rge es in Ihrem aktuellen Zweig (I nehme an, das ist master) und beheben Sie Konflikte zusammenführen:

$ git merge origin/other-branch 
# Fix merge conflicts, if they occur 
# Add merge conflict fixes 
$ git commit # And commit the merge! 
+0

Nein, das Problem besteht beim Abrufen, nicht beim Zusammenführungsschritt. –

+2

Normalerweise werden Fernbedienungen so eingerichtet, dass Fetches erzwungen werden, auch wenn sie nicht zu einem Fast-Forward-Commit führen. Daher sollte es beim Fetch nicht auftreten, es sei denn, das OP hat etwas mit der üblichen Konfiguration geändert. Das Fast-Forward-Problem kann beim Abrufen * oder * Zusammenführen auftreten. Was bringt Sie dazu zu sagen, dass das Problem definitiv darin besteht, zu holen und nicht zu verschmelzen? – mipadi

+0

Ich folge diesen Schritten (fetch, merge). Git sagt mir, dass es nichts zu tun gibt. Wenn ich versuche zu begehen, stöhnt es über Schnellvorläufe. –

27

Ich bin nicht sicher, ob ich das Problem vollständig verstehen, sondern ziehen einen vorhandenen Zweig wird folgendermaßen gemacht (zumindest funktioniert es für mich :)

git pull origin BRANCH 

Dies wird unter der Annahme, dass die örtliche Niederlassung wird ausgeschaltet erstellt von der Ursprung/ZWEIG.

88

Mit den folgenden Befehlen können Sie eine Verzweigung zu einer Verzweigung ziehen.

git pull {repo} {remotebranchname}:{localbranchname} 

git pull origin xyz:xyz 

Wenn Sie auf dem Master-Zweig sind auch zuerst Sie könnte ein Zweig wie Kasse:

git checkout -b xyz 

Dies schafft einen neuen Zweig, „xyz“, aus dem Master und überprüft sie direkt aus.

Dann tun Sie:

git pull origin xyz 

Dies zieht die neue Niederlassung zu Ihrem lokalen xyz Zweig.

+0

Perfekt! Ich kannte diese Syntax einfach nicht: git pull {repo} {remotebranchname}: {localbranchname}. Frage, ob dieser Pull nicht funktioniert (vielleicht hat jemand den Zweig aktualisiert und es würde Merge-Konflikte geben), was sind meine Optionen? – Costa

+6

Ich habe dies abgelehnt, weil es versucht, den Remote-Zweig in Ihren aktuellen Zweig (z. B. Master) zu verschmelzen. Das ist nicht das, was die meisten Leute wollen, und es ist nicht, was das OP verlangt hat. Die Antwort von @mohit ist die richtige Wahl. – Phrogz

+0

Phrogz - sieht aus wie dieses Verhalten in den letzten Versionen von Git geändert hat. Ich habe das schon mal benutzt und es hat sehr gut funktioniert. – Pawan

241

einfach Ihre Remote-Niederlassungen verfolgen explizit und eine einfache git pull tun genau das, was Sie wollen:

git branch -f remote_branch_name origin/remote_branch_name 
git checkout remote_branch_name 

Oder noch passendere in der GitHub documentation on forking:

git branch -f new_local_branch_name upstream/remote_branch_name 
+0

Wenn Sie tun: ** git Checkout remote_branch name **, ist dies eine lokale Operation? – berto77

+28

Wenn Sie 'Kein gültiger Objektname:' Herkunft/Remote_branch_name 'erhalten, führen Sie zuerst' git fetch origin 'aus. –

+0

@ Berto77 ja, ist es. – dbliss

65

Der beste Weg ist:

git checkout -b <new_branch> <remote repo name>/<new_branch> 
25

git fetch wird die aktuelle Liste der Filialen greifen.

Jetzt können Sie git checkout MyNewBranch

Fertig :)


Für weitere Informationen siehe docs: git fetch

5

Das hat mir geholfen, Fern Zweig zu erhalten, bevor sie in andere Zusammenführung:

git fetch repo xyz:xyz 
git checkout xyz 
1

Sie auch

git pull -r origin master 

tun können Konflikte beheben fusionieren, wenn eine

git rebase --continue 

-r für Fütterungsmaterial ist. Dies wird Ihnen Zweigstruktur von

 v master  
o-o-o-o-o 
    \o-o-o 
     ^other branch 

zu

 v master  
o-o-o-o-o-o-o-o 
      ^other branch 

machen diese zu einer saubereren Geschichte führen wird. Hinweis: Falls Sie Ihren anderen Zweig bereits auf den Ursprung (oder eine andere entfernte Stelle) verschoben haben, müssen Sie möglicherweise zwingen, Ihren Zweig nach der Rebase zu drücken.

git push -f origin other-branch 
0
git pull <gitreponame> <branchname> 

Normalerweise, wenn Sie an Ihrem Code zugewiesen Repo haben, dann würde der gitreponame Herkunft sein.

Wenn Sie an zwei Repos arbeiten, wie einer ist lokal und ein anderer für remote wie Sie Repos Liste von Git Remote-V überprüfen können. Dies zeigt an, wie viele Repos Ihrem aktuellen Code zugewiesen sind.

BranchName sollte in entsprechenden gitreponame existieren.

können Sie folgenden zwei Befehle verwenden, um oder entfernen

git remote add <gitreponame> <repourl> 
git remote remove <gitreponame>