Machen Sie einen vorhandenen Git-Zweig zu einem Remote-Zweig?


3535

Ich weiß, wie man einen neuen Zweig erstellt, der entfernte Zweige verfolgt, aber wie kann ich einen vorhandenen Zweig dazu bringen, einen entfernten Zweig zu verfolgen?

Ich weiß, dass ich die .git/configDatei einfach bearbeiten kann, aber es scheint, dass es einen einfacheren Weg geben sollte.


26
Wie unten erwähnt, können Sie für einen vorhandenen Zweig verwenden git push -u origin branch-name.
Zags

3
Wenn der lokale Zweig der aktuelle Zweig ist und der lokale Zweig noch keine Fernbedienung verfolgt, git pullwerden häufig hilfreiche Nachrichten über den entsprechenden Befehl zum
Festlegen der

57
Es ist ärgerlich, wenn man Git lernt, einen Link zur Git-Dokumentation zu sehen. Diese Dokumentation scheint für Leute geschrieben zu sein, die bereits wissen, was sie mit Git machen.
Felipe Alvarez

9
Ab Git 2.10 sollten Sie zuerst zum vorgesehenen lokalen Zweig git branch --set-upstream-to origin/<branch>
auschecken

2
--set-upstreamerzeugt einen Fehler: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.So git branch --set-upstream-to origin/<branch name>ist der aktuelle Befehl, der funktioniert.
Super Jade

Antworten:


4270

Bei einem Zweig foound einer Fernbedienung upstream:

Ab Git 1.8.0:

git branch -u upstream/foo

Oder wenn der lokale Zweig foonicht der aktuelle Zweig ist:

git branch -u upstream/foo foo

Wenn Sie längere Befehle eingeben möchten, entsprechen diese den beiden oben genannten:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Ab Git 1.7.0:

git branch --set-upstream foo upstream/foo

Anmerkungen:

  • Alle oben genannten Befehle bewirken, dass der lokale Zweig fooden Remote-Zweig foovon Remote verfolgt upstream.
  • Die alte (1.7.x) Syntax wird zugunsten der neuen (1.8+) Syntax nicht mehr empfohlen. Die neue Syntax soll intuitiver und leichter zu merken sein.
  • Das Definieren eines Upstream-Zweigs schlägt fehl, wenn es für neu erstellte Fernbedienungen ausgeführt wird, die noch nicht abgerufen wurden. Führen Sie in diesem Fall git fetch upstreamvorher aus.

Siehe auch: Warum muss ich die ganze Zeit "--set-upstream" machen?


124
Ist "Upstream" der Name der Fernbedienung? dh was würden die meisten standardmäßig "Ursprung" nennen?
Andrew Vit

172
@ Andrew: Ja. git branch --set-upstream master origin/masterDies entspricht dem, was automatisch ausgeführt wird, wenn Sie ein Repository zum ersten Mal klonen.
Dan Moulding

62
In einem ähnlichen Zusammenhang ist es fantastisch, dies zu Ihrer gitconfig hinzuzufügen: "[push] default = tracking" Dadurch wird es so, dass
Pushs an

61
Ich erhalte "fatal: Kein gültiger Objektname: 'origin / master'."
Joachim

84
git push -u origin foo via
Cotton

236

Sie können Folgendes tun (vorausgesetzt, Sie sind auf dem Master ausgecheckt und möchten einen Push an einen Remote-Zweigstellenmaster senden):

Richten Sie die 'Fernbedienung' ein, falls Sie sie noch nicht haben

git remote add origin ssh://...

Konfigurieren Sie nun den Master so, dass er weiß, wie er verfolgt werden soll:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Und drücken Sie:

git push origin master

Ist es wirklich erforderlich, die Fernbedienung und den Zweig im Push? Ich meine, Sie brauchen es nur, wenn Ihre ausgecheckte Filiale nicht die ist, die Sie pushen möchten, oder?
Doppelgänger

5
Ja - aber aus dem Speicher müssen Sie möglicherweise für den ersten Push explizit sein. Kann natürlich leicht getestet werden ... :)
Paul Hedderly

+1 Dies ist die Antwort für Windows-Benutzer, die mit der msysgit "Vorschau" vor 1.8 nicht weiterkommen. Dank dafür.
John

3
Dies ist die einzige Antwort, die für mich funktioniert hat. Als ich die akzeptierte Antwort versuchte, um die Upstream-Fernbedienung für einen vorhandenen Zweig einzurichten, erhielt ich : error: the requested upstream branch 'upstream/master' does not exist.
Steve K

4
@SteveK, das ist höchstwahrscheinlich, weil Ihr Upstream aufgerufen wird originund nicht upstream.
Umläute

160

Ich mache dies als Nebeneffekt des Drückens mit der -uOption wie in

$ git push -u origin branch-name

Die äquivalente lange Option ist --set-upstream.

Der git-branchBefehl versteht auch --set-upstream, aber seine Verwendung kann verwirrend sein. Version 1.8.0 ändert die Schnittstelle.

git branch --set-upstreamist veraltet und kann in relativ ferner Zukunft entfernt werden. git branch [-u|--set-upstream-to]wurde mit einer vernünftigeren Reihenfolge von Argumenten eingeführt.

Es war verlockend zu sagen git branch --set-upstream origin/master, aber das veranlasst Git, den lokalen Zweig "origin / master" so zu arrangieren, dass er in den aktuell ausgecheckten Zweig integriert wird, was höchst unwahrscheinlich ist, was der Benutzer meinte. Die Option ist veraltet. Verwenden Sie stattdessen die neue Option --set-upstream-to(kurz und bündig -u).

Angenommen, Sie haben eine lokale fooNiederlassung und möchten, dass diese die Niederlassung mit demselben Namen wie ihre vorgelagerte Niederlassung behandelt. Mach das möglich mit

$ git branch foo
$ git branch --set-upstream-to=origin/foo

oder nur

$ git branch --set-upstream-to=origin/foo foo

1
Dies ist eine viel bessere Lösung imo
Nils_e

--set-upstream-to=...ist genau das, wonach ich gesucht habe.
Richard

54

Möglicherweise finden Sie das git_remote_branchTool hilfreich. Es bietet einfache Befehle zum Erstellen, Veröffentlichen, Löschen, Verfolgen und Umbenennen von Remote-Zweigen. Eine nette Funktion ist, dass Sie einen grbBefehl bitten können, zu erklären, welche Git-Befehle er ausführen würde.

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

3
grb ist ein rubinroter Edelstein, auf den zugegriffen werden kann, wie auf ihrem Github erklärt
mcabrams

6
Das OP stellt Fragen zu Git selbst. Also nicht ein neues Tool einführen wäre wahrscheinlich besser.
Zeekvfu

grb ist ein Alias ​​für git-rebase in meiner macOS-Installation. Ich habe das nicht getan :)
Ben Sinclair

53

Eigentlich damit die akzeptierte Antwort funktioniert:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

Die lokale Niederlassung verfolgte bereits eine Niederlassung, sodass wir davon ausgehen können, dass das Remote-Repo bereits hinzugefügt wurde.
Doppelgänger

Dopplerganger: Siehe Joachims Kommentar zur akzeptierten Antwort. Wie auch immer, die Annahmen unterscheiden sich leicht - das macht die Dinge so interessant;)
Hedgehog

44

Ich glaube, dass Sie bereits in Git 1.5.x einen lokalen Zweig wie diesen zu $BRANCHeinem entfernten Zweig machen origin/$BRANCHkönnen.

In Anbetracht dessen $BRANCHund origin/$BRANCHvorhanden, und Sie haben derzeit nicht ausgecheckt $BRANCH(wechseln Sie weg, wenn Sie haben), tun Sie:

git branch -f --track $BRANCH origin/$BRANCH

Dies wird $BRANCHals Tracking-Zweig neu erstellt. Das -ferzwingt die Schöpfung trotz $BRANCHbereits vorhandener. --trackist optional, wenn die üblichen Standardeinstellungen vorhanden sind (dh der Parameter git-config branch.autosetupmergeist true).

Hinweis: Wenn es origin/$BRANCHnoch nicht vorhanden ist, können Sie es erstellen, indem Sie Ihr lokales Verzeichnis $BRANCHin das Remote-Repository verschieben mit:

git push origin $BRANCH

Gefolgt vom vorherigen Befehl, um den lokalen Zweig in einen Verfolgungszweig zu verwandeln.


1
git push origin $BRANCHwar das, wonach ich gesucht habe.
Benutzer

Nachdem Sie alle möglichen Lösungen ausprobiert haben, einschließlich der Einrichtung eines Upstreams wie oben beschrieben, hat nichts funktioniert. Ich wollte nur 1 neues Commit von einem Remote-Zweig in meinen lokalen Zweig ziehen und habe das Tracking zunächst nicht eingerichtet. Der Befehl git branch -f --track $BRANCH origin/$BRANCHmacht den Trick.
DemitryT

38

1- Aktualisieren Sie Ihre lokalen Metadaten mit: git fetch --all

Geben Sie hier die Bildbeschreibung ein

2- Zeigen Sie Ihre Remote- und lokalen Zweige mit: git branch -a , siehe folgenden Screenshot

Geben Sie hier die Bildbeschreibung ein

3- Wechseln Sie zu dem Zielzweig, den Sie mit der Fernbedienung verknüpfen möchten: using

git checkout branchName

Beispiel:

Geben Sie hier die Bildbeschreibung ein

4- Verknüpfen Sie Ihren lokalen Zweig mit einem Remote-Zweig, indem Sie:

Git-Zweig --set-upstream-to nameOfRemoteBranch

NB: nameOfRemoteBranch : zum Kopieren aus der Ausgabe von Schritt 2 "git branch -r"

Anwendungsbeispiel:

Geben Sie hier die Bildbeschreibung ein


1
Meist einfache und einfache Antwort.
Vibs2006

25

Stellen Sie sicher, dass Sie Folgendes ausführen:

git config push.default tracking

störungsfrei schieben zu können


1
Dies könnte praktisch sein. Wir könnten jedoch feststellen, dass laut git-config(1)Handbuchseite das trackingSynonym veraltet ist upstream.
FooF

23

Das Bearbeiten .git/configist wahrscheinlich der einfachste und schnellste Weg. Genau das tun die Git-Befehle für den Umgang mit Remote-Zweigen.

Wenn Sie nicht mit der Datei von Hand herumspielen möchten (und es ist nicht so schwer zu tun), können Sie es immer verwenden git config... aber auch hier wird die .git/configDatei sowieso nur bearbeitet .

Es gibt natürlich Möglichkeiten, einen Remote-Zweig bei der Verwendung automatisch zu verfolgen git checkout( --trackz. B. durch Übergeben des Flags), aber diese Befehle funktionieren mit neuen Zweigen, nicht mit vorhandenen.


18

Kurz gesagt

git branch --set-upstream yourLocalBranchName origin/develop

Dadurch wird Ihr yourLocalBranchNameTrack zum Remote-Zweig namens develop.


1
@ Quincy Check Gregs Antwort - benutze git push -u origin branch(oder --set-upstream-to) stattdessen
Tobias Kienzler

@ MadNik, was ist der Unterschied zwischen --set-upstreamund --track? Ich verstehe nicht ganz, warum ich eins über das andere verwenden soll.
Acumenus


12

Ich verwende den folgenden Befehl (Angenommen, Ihr lokaler Filialname lautet "Filialname-lokal" und der Name der Remote-Filiale lautet "Filialname-remote"):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

Wenn sowohl lokale als auch entfernte Zweige denselben Namen haben, gehen Sie einfach wie folgt vor:

$ git branch --set-upstream-to=origin/branch-name branch-name

Sie haben "Verzweigungsname" und "Ursprung / Verzweigungsname" in der Befehlszeile umgekehrt. Der Upstream kommt vor dem Lokal.
Maharvey67

@ maharvey67 du hast recht, danke. Antwort bearbeitet.
Yrazlik

Dies war Gold, danke, auch weil keine der Optionen in der akzeptierten Antwort in
Ordnung ist,

8

Hier mit githubund git version 2.1.4einfach tun:

$ git clone git@github.com:user/repo.git

Und Fernbedienungen kommen von selbst, auch wenn sie nicht lokal verbunden sind:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Aber natürlich noch keine lokale Niederlassung:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Sehen? Wenn Sie jetzt nur die Entwicklung auschecken, wird die Magie automatisch ausgeführt:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

So einfach!


Zusammenfassung. Führen Sie einfach diese 2 Befehle aus:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
Ein hervorragendes Beispiel für meinen identischen Anwendungsfall. Obwohl es keine Anzeichen für einen lokalen "Entwicklungs" -Zweig gibt, erscheint dieser Zweig beim Auschecken des "Entwicklungs" -Zweigs und ist auf magische Weise so eingerichtet, dass er den "Zweig" des Remote-Zweigs vom Ursprung aus verfolgt. Ich schätze das Schritt-für-Schritt-Beispiel und die Erklärung!
ElliotPsyIT

8

Verwenden Sie die Option '--track'

  • Nach einem git pull:

    git checkout --track <remote-branch-name>

  • Oder:

    git fetch && git checkout <branch-name>


7

Zum Erstellen eines neuen Zweigs können Sie den folgenden Befehl verwenden

 git checkout --track -b Beispiel Ursprung / Beispiel 
Verwenden Sie den folgenden Befehl, damit der bereits erstellte Zweig eine Verbindung zwischen Remote und dann von diesem Zweig her herstellt

 git branch -u origin / remote-branch-name


5

Dies ist keine direkte Antwort auf diese Frage, aber ich wollte hier eine Notiz für alle hinterlassen, die möglicherweise das gleiche Problem wie ich haben, wenn sie versuchen, einen Upstream-Zweig zu konfigurieren.

Seien Sie vorsichtig bei push.default .

Bei älteren Git-Versionen war die Standardeinstellung " Matching" , was zu sehr unerwünschtem Verhalten führen würde, wenn Sie beispielsweise Folgendes haben:

Tracking des lokalen Zweigs "Master" zum Ursprung / Master

Remote Branch "Upstream" Tracking zu Upstream / Master

Wenn Sie versuchen, "Push zu git", wenn Sie sich im Zweig "Upstream" befinden, würde git mit push.default automatisch versuchen, den lokalen Zweig "master" in "upstream / master" zusammenzuführen, was eine Menge Chaos verursacht.

Dies führt zu einem vernünftigeren Verhalten:

git config --global push.default upstream


Du hast das nicht umsonst gelassen. Vielen Dank.
Stefgosselin

4

In gewisser Weise habe ich versucht, einem vorhandenen Zweig einen Remote-Tracking-Zweig hinzuzufügen, hatte jedoch keinen Zugriff auf das Remote-Repository auf dem System, auf dem ich diesen Remote-Tracking-Zweig hinzufügen wollte (da ich häufig eine Kopie davon exportiere Repo über Sneakernet an ein anderes System, das Zugriff auf diese Fernbedienung hat). Ich stellte fest, dass es keine Möglichkeit gab, das Hinzufügen eines Remote-Zweigs zu dem noch nicht abgerufenen lokalen Zweig zu erzwingen (daher wusste local nicht, dass der Zweig auf dem Remote vorhanden war, und ich würde den Fehler erhalten :) the requested upstream branch 'origin/remotebranchname' does not exist.

Am Ende gelang es mir, den neuen, bisher unbekannten Remote-Zweig (ohne Abrufen) hinzuzufügen, indem ich eine neue Head-Datei bei hinzufügte .git/refs/remotes/origin/remotebranchnameund dann den Ref kopierte (Augapfel war am schnellsten, lahm wie es war ;-) vom System mit Zugriff auf den Ursprung Repo zur Workstation (mit dem lokalen Repo, auf dem ich den Remote-Zweig hinzugefügt habe).

Sobald das erledigt war, konnte ich dann verwenden git branch --set-upstream-to=origin/remotebranchname


3

oder einfach von:

Wechseln Sie in die Filiale, wenn Sie noch nicht in der Filiale sind:

[za]$ git checkout branch_name

Lauf

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

und Sie sind bereit:

 [za]$ git push origin branch_name

Sie können sich immer die Konfigurationsdatei ansehen, um zu sehen, was was verfolgt, indem Sie Folgendes ausführen:

 [za]$ git config -e

Es ist auch schön, das zu wissen. Es zeigt, welche Zweige verfolgt werden und welche nicht. ::

  [za]$ git remote show origin 

0

Für alle, die wie ich nur Ihren lokalen Filialnamen mit dem Namen der Remote-Filiale synchronisieren möchten, ist hier ein praktischer Befehl:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

So vermeiden Sie, dass Sie sich jedes Mal daran erinnern, was Sie tun müssen, wenn Sie die Nachricht erhalten:

Bitte geben Sie an, mit welchem ​​Zweig Sie zusammenführen möchten. Siehe Git-Pull (1)
für Details.
..... .....

Sie können das folgende Skript verwenden, mit dem der Ursprung für den aktuellen Zweig, in dem Sie sich befinden, als Upstream festgelegt wird .

In meinem Fall habe ich so gut wie nie gesetzt etwas anderes als Ursprung als Standard - Upstream . Außerdem behalte ich fast immer den gleichen Filialnamen für den lokalen und den Remote-Zweig. Also passt folgendes zu mir:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

-1

Das würde auch funktionieren

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.