Git zieht einen bestimmten Zweig von GitHub

629

Ich habe ein Projekt mit mehreren Niederlassungen. Ich habe sie zu GitHub verschoben , und jetzt, da jemand anderes an dem Projekt arbeitet, muss ich ihre Zweige von GitHub abrufen. Es funktioniert gut im Master. Aber sagen Sie, dass jemand einen Zweig erstellt hat xyz. Wie kann ich einen Zweig xyzvon GitHub abrufen und ihn xyzauf meinem Zweig zusammenführen localhost?

Ich habe hier tatsächlich meine Antwort: Push and Pull-Zweige in Git

Aber ich bekomme einen Fehler "! [Abgelehnt]" und etwas über "nicht schneller Vorlauf".

Irgendwelche Vorschläge?

tybro0103
quelle
3
Was ist der eigentliche Befehl, den Sie ausführen?
Alex N.
1
Es ist ein Abruf, der mit der Nachricht "Nicht schneller Vorlauf" fehlschlagen kann. Haben Sie den Remote-Tracking-Zweig (origin / xyz) geändert oder wurde der Zweig im Remote-Repository zurückgespult / neu geschrieben? Youmight muss " git fetch origin --force" verwenden, aber bitte lesen Sie die Dokumentation, bevor Sie es tun.
Jakub Narębski

Antworten:

754

Aber ich bekomme einen Fehler "! [Abgelehnt]" und etwas über "nicht schneller Vorlauf"

Das liegt daran, dass Git die Änderungen aus den Zweigen nicht in Ihrem aktuellen Master zusammenführen kann. Angenommen, Sie haben den Zweig ausgecheckt masterund möchten ihn im Remote-Zweig zusammenführen other-branch. Wenn Sie dies tun:

$ git pull origin other-branch

Git macht im Grunde das:

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

Das heißt, a pullist nur ein fetchgefolgt von a merge. Wenn pull-ing jedoch zusammengeführt wird, wird Git nur zusammengeführt, other-branch wenn eine Schnellvorlaufzusammenführung durchgeführt werden kann . Eine Schnellvorlaufzusammenführung ist eine Zusammenführung, bei der der Kopf des Zweigs, in den Sie zusammenführen möchten, direkt von dem Kopf des Zweigs abstammt, den Sie zusammenführen möchten. Wenn Sie beispielsweise über diesen Verlaufsbaum verfügen, führt das Zusammenführen other-branchzu einer schnellen Zusammenführung:

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

Dies wäre jedoch kein schneller Vorlauf:

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

Um Ihr Problem zu lösen, rufen Sie zuerst den Remote-Zweig ab:

$ git fetch origin other-branch

Führen Sie es dann in Ihrem aktuellen Zweig zusammen (ich nehme an, dass dies der Fall ist master) und beheben Sie alle Zusammenführungskonflikte:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!
Mipadi
quelle
Nein, das Problem liegt beim Abrufen, nicht beim Zusammenführen.
Jakub Narębski
3
Normalerweise sind Fernbedienungen so eingerichtet, dass Abrufe erzwungen werden, auch wenn sie nicht zu einem Schnellvorlauf-Commit führen. Daher sollte dies beim Abrufen nicht erfolgen, es sei denn, das OP hat etwas mit der üblichen Konfiguration geändert. Das Problem mit dem schnellen Vorlauf kann beim Abrufen oder Zusammenführen auftreten. Was lässt Sie sagen, dass das Problem definitiv beim Abrufen und nicht beim Zusammenführen liegt?
Mipadi
Ich folge diesen Schritten (holen, zusammenführen). Git sagt mir, dass es nichts zu tun gibt. Wenn ich versuche zu begehen, fällt es über das Stöhnen über den schnellen Vorlauf.
Jean Jordaan
1
@mipadi Ich hatte das gleiche Problem wie Jean und obwohl ich nicht sagen kann, dass die Fernbedienung auf die nicht standardmäßige Weise eingerichtet ist, die Sie erwähnt haben, kann ich sagen, dass git fetch -fich mein Problem behoben habe! Vielen Dank!
Cregox
1
Dadurch wird der entfernte Zweig xzymit dem lokalen Zweig zusammengeführt master, was in der ursprünglichen Frage nicht impliziert wurde. "Wie kann ich Zweig xyz von GitHub abrufen und in Zweig xyz auf meinem lokalen Host zusammenführen?"
user5359531
301

Verfolgen Sie einfach Ihre Remote-Filialen explizit und ein einfacher git pullwird genau das tun, was Sie wollen:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Letzteres ist eine lokale Operation.

Oder noch passender zur GitHub-Dokumentation zum Gabeln :

git branch -f new_local_branch_name upstream/remote_branch_name
innaM
quelle
39
Wenn Sie 'Kein gültiger Objektname:' origin / remote_branch_name 'erhalten, führen Sie zuerst' git fetch origin 'aus.
Martin Konicek
130

Mit den folgenden Befehlen können Sie einen Zweig zu einem Zweig ziehen.

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

git pull origin xyz:xyz

Wenn Sie sich in der Hauptniederlassung befinden, können Sie auch zuerst eine Verzweigung wie folgt auschecken:

git checkout -b xyz

Dadurch wird ein neuer Zweig "xyz" vom Master erstellt und direkt ausgecheckt.

Dann machst du:

git pull origin xyz

Dadurch wird der neue Zweig in Ihren lokalen xyzZweig gezogen.

Robert Cabri
quelle
1
Perfekt! Ich kannte diese Syntax einfach nicht: git pull {repo} {remotebranchname}: {localbranchname}. Frage: Wenn dieser Pull nicht funktioniert (möglicherweise hat jemand den Zweig aktualisiert und es würde zu Zusammenführungskonflikten kommen), welche Optionen habe ich?
Costa
7
Ich stimme dem zu, weil es versucht, den Remote-Zweig mit Ihrem aktuellen Zweig (z. B. Master) zusammenzuführen. Dies ist nicht das, was die meisten Menschen tun wollen, und es ist nicht das, was das OP verlangt hat. Die Antwort von @mohit ist die richtige Wahl.
Phrogz
1
Phrogz - sieht so aus, als ob sich dieses Verhalten in den letzten Versionen von Git geändert hat. Ich habe das schon mal benutzt und es hat perfekt funktioniert.
Pawan
88

Der beste Weg ist:

git checkout -b <new_branch> <remote repo name>/<new_branch>
Mohit
quelle
1
Nachdem ich einen neuen "dev" -Zweig auf github erstellt und die oben genannten Schritte ausgeführt habe, wurde die folgende Fehlermeldung angezeigt: "fatal: origin / dev ist kein Commit und ein Zweig" dev "kann nicht daraus erstellt werden." Lösung war "git Holen Sie sich die unten stehende Lösung von Bradley Flood und führen Sie dann Mohits Antwort erneut aus.
TomEberhard
46

git fetch holt sich die neueste Liste der Filialen.

Jetzt kannst du git checkout MyNewBranch

Erledigt :)


Weitere Informationen finden Sie in den Dokumenten: git fetch

Bradley Flood
quelle
37

Ich bin nicht sicher, ob ich das Problem vollständig verstehe, aber das Ziehen eines vorhandenen Zweigs erfolgt folgendermaßen (zumindest funktioniert es bei mir :)

git pull origin BRANCH

Dies setzt voraus, dass Ihre lokale Niederlassung außerhalb des Ursprungs / BRANCH erstellt wird.

Alex N.
quelle
15

Dies hat mir geholfen, einen Remote-Zweig zu erhalten, bevor ich ihn in einen anderen zusammenführte:

git fetch repo xyz:xyz
git checkout xyz
anatoly techtonik
quelle
7

Einfach ausgedrückt, wenn Sie den Zweig von GitHub ziehen möchten the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want
Adrien Renaud
quelle
3
git pull <gitreponame> <branchname>

Wenn Sie Ihrem Code nur Repo zugewiesen haben, ist der Gitreponame normalerweise der Ursprung.

Wenn Sie an zwei Repos arbeiten, von denen eines lokal und eines für Remote ist, können Sie die Repo-Liste von git remote -v aus überprüfen . Dies zeigt, wie viele Repos Ihrem aktuellen Code zugewiesen sind.

BranchName sollte im entsprechenden Gitreponame vorhanden sein.

Sie können die folgenden zwei Befehle verwenden, um Repos hinzuzufügen oder zu entfernen

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
Prathap
quelle
2

Sie können auch tun

git pull -r origin master

Beheben Sie etwaige Zusammenführungskonflikte

git rebase --continue

-r ist für Rebase. Dadurch erhalten Sie eine Verzweigungsstruktur 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

Dies wird zu einer saubereren Geschichte führen. Hinweis: Falls Sie Ihren anderen Zweig bereits zum Ursprung (oder zu einer anderen Fernbedienung) verschoben haben, müssen Sie möglicherweise den Zweig nach dem erneuten Basen erzwingen.

git push -f origin other-branch
PKV
quelle
1

Ich tat

git branch -f new_local_branch_name origin/remote_branch_name

Anstatt

git branch -f new_local_branch_name upstream/remote_branch_name

Wie von @innaM vorgeschlagen. Als ich die Upstream-Version verwendete, stand dort 'fatal: Kein gültiger Objektname:' upstream / remote_branch_name ''. Ich habe es nicht git fetch originals Kommentar vorgeschlagen, sondern einfach ersetzt upstreammit origin. Ich denke, sie sind gleichwertig.

Vicky
quelle