Ich weiß, wie man einen neuen Zweig erstellt, der entfernte Zweige verfolgt, aber wie mache ich einen vorhandenen Zweig zu einem entfernten Zweig?
Ich weiß, dass ich nur die .git/config
-Datei bearbeiten kann, aber es scheint, dass es einen einfacheren Weg geben sollte.
Eine Verzweigung foo
und eine entfernte upstream
gegeben:
Ab Git 1.8.0:
git branch -u upstream/foo
Oder wenn der lokale Zweig foo
nicht der aktuelle Zweig ist:
git branch -u upstream/foo foo
Wenn Sie längere Befehle eingeben möchten, entsprechen diese den beiden oben genannten Befehlen:
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:
foo
, den fernen Zweig foo
vom fernen upstream
aus zu verfolgen.git fetch upstream
aus.Siehe auch: Warum muss ich "--set-upstream" die ganze Zeit ausführen?
Sie können Folgendes tun (vorausgesetzt, Sie sind auf dem Master ausgecheckt und möchten auf einen Remote-Zweig-Master pushen):
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:
git config branch.master.remote Origin
git config branch.master.merge refs/heads/master
Und Push:
git Push Origin master
Ich mache dies als Nebeneffekt des Drückens mit der Option -u
wie in
$ git Push -u Origin branch-name
Die äquivalent lange Option ist --set-upstream
.
Der Befehl git-branch
versteht auch --set-upstream
, aber seine Verwendung kann verwirrend sein. Version 1.8. ändert die Schnittstelle.
git branch --set-upstream
ist veraltet und wird möglicherweise in relativ ferner Zukunft entfernt.git branch [-u|--set-upstream-to]
wurde mit einer vernünftigeren Reihenfolge von Argumenten eingeführt.…
Es war verlockend,
git branch --set-upstream Origin/master
zu sagen, aber das veranlasst Git, den lokalen Zweig "Origin/master" so einzurichten, dass er in den derzeit ausgecheckten Zweig integriert wird, was vom Benutzer höchst unwahrscheinlich ist. Die Option ist veraltet. Verwenden Sie stattdessen die neue Option--set-upstream-to
(mit einem kurzen und süßen-u
).
Angenommen, Sie haben eine lokale foo
Verzweigung und möchten, dass sie die Verzweigung mit demselben Namen wie die vorgelagerte 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
Möglicherweise ist das Tool git_remote_branch
hilfreich. Es bietet einfache Befehle zum Erstellen, Veröffentlichen, Löschen, Verfolgen und Umbenennen von Zweigstellen. Eine nette Funktion ist, dass Sie einen grb
-Befehl fragen können, um 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
_
Eigentlich für die akzeptierte Antwort zu arbeiten:
git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa
Ich glaube, dass Sie schon in Git 1.5.x eine lokale Verzweigung $BRANCH
nachverfolgen können, die eine entfernte Verzweigung Origin/$BRANCH
ist.
Vorausgesetzt, dass $BRANCH
und Origin/$BRANCH
existieren und Sie $BRANCH
noch nicht ausgecheckt haben (wechseln Sie, wenn Sie dies getan haben), tun Sie Folgendes:
git branch -f --track $BRANCH Origin/$BRANCH
Dadurch wird $BRANCH
als Verfolgungszweig neu erstellt. Der -f
erzwingt die Erstellung, obwohl $BRANCH
bereits vorhanden ist. --track
ist optional, wenn die üblichen Standardeinstellungen vorhanden sind (d. H. Der git-config-Parameter branch.autosetupmerge
ist true).
Hinweis: Wenn Origin/$BRANCH
noch nicht vorhanden ist, können Sie es erstellen, indem Sie Ihr lokales $BRANCH
in das Remote-Repository verschieben:
git Push Origin $BRANCH
Gefolgt von dem vorherigen Befehl, um den lokalen Zweig in einen Verfolgungszweig umzuwandeln.
1- Aktualisieren Sie Ihre lokalen Metadaten mit: git fetch --all
2- Zeigen Sie Ihre entfernten und lokalen Zweige mit: git branch -a , siehe folgenden Screenshot
3- Wechseln Sie zu dem Zielzweig, den Sie mit der Fernbedienung verknüpfen möchten: using
git checkout branchName
beispiel:
4- Verknüpfen Sie Ihre lokale Niederlassung mit einer Remote-Niederlassung unter Verwendung von:
Git-Zweig --set-upstream-to nameOfRemoteBranch
N.B: nameOfRemoteBranch : zum Kopieren aus der Ausgabe von Schritt 2 "git branch -r"
Anwendungsbeispiel:
Stellen Sie sicher, dass Sie Folgendes ausführen:
git config Push.default tracking
störungsfrei pushen zu können
Das Bearbeiten von .git/config
ist wahrscheinlich der einfachste und schnellste Weg. Das ist sowieso, was die Git-Befehle für den Umgang mit entfernten Verzweigungen tun.
Wenn Sie nicht von Hand mit der Datei herumspielen möchten (und das ist nicht so schwer), können Sie immer git config
verwenden, um dies zu tun ... aber auch hier wird die .git/config
-Datei nur bearbeitet.
Es gibt natürlich Möglichkeiten, einen entfernten Zweig automatisch zu verfolgen, wenn git checkout
verwendet wird (z. B. durch Übergeben des Flags --track
), aber diese Befehle funktionieren mit new Zweigen, die nicht vorhanden sind.
Kurz gesagt
git branch --set-upstream yourLocalBranchName Origin/develop
Dadurch verfolgt Ihr yourLocalBranchName
den entfernten Zweig mit dem Namen develop
.
Für 1.6.x kann dies mit dem Tool git_remote_branch erfolgen:
grb track foo upstream
Das wird Git veranlassen, foo
upstream/foo
aufzuspüren.
Ich verwende den folgenden Befehl (Angenommen, Ihr lokaler Filialname lautet "Filialname-lokal" und der Name der fernen Filiale lautet "Filialname-fern"):
$ git branch --set-upstream-to=Origin/branch-name-remote branch-name-local
Wenn sowohl lokale als auch ferne Zweige denselben Namen haben, gehen Sie wie folgt vor:
$ git branch --set-upstream-to=Origin/branch-name branch-name
Hier können Sie mit github
und git version 2.1.4
Folgendes tun:
$ git clone [email protected]:user/repo.git
Und Fernbedienungen kommen von itelsef, auch wenn sie nicht lokal verknüpft sind:
$ git remote show Origin
* remote Origin
Fetch URL: [email protected]:user/repo.git
Push URL: [email protected]: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 Ortsniederlassung:
$ git branch
* master <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Sehen? Wenn Sie jetzt nur Develp 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 [email protected]:user/repo.git
$ git checkout develop
Nach einem git pull
:
git checkout --track <remote-branch-name>
Oder:
git fetch && git checkout <branch-name>
Zum Erstellen eines neuen Zweigs können Sie den folgenden Befehl verwenden
git checkout --track -b Beispiel Herkunft/Beispiel
Git Branch -u Origin/Remote-Branch-Name
Dies ist keine direkte Antwort auf diese Frage, aber ich wollte hier eine Notiz für alle hinterlassen, die möglicherweise das gleiche Problem haben wie ich, wenn sie versuchen, einen Upstream-Zweig zu konfigurieren.
Seien Sie vorsichtig mit 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:
Lokale Verzweigung "Master" -Verfolgung zu Origin/Master
Remote Branch "Upstream" Tracking zu Upstream/Master
Wenn Sie im "Upstream" -Zweig "git Push" verwenden, würde mit Push.default matching git automatisch versuchen, den lokalen Zweig "master" in "upstream/master" zusammenzuführen, was zu einem Ganzen führt viel Chaos.
Dies führt zu einem vernünftigeren Verhalten:
git config --global Push.default upstream
In ähnlicher Weise habe ich versucht, einer vorhandenen Verzweigung eine Remote-Verfolgungsverzweigung hinzuzufügen, hatte jedoch keinen Zugriff auf das Remote-Repository auf dem System, auf dem ich diese Remote-Verfolgungsverzweigung hinzufügen wollte (da ich häufig eine Kopie davon exportiere) Repo über Sneakernet zu einem anderen System, das Zugriff auf Push zu dieser Fernbedienung hat). Ich stellte fest, dass es keine Möglichkeit gab, dem noch nicht abgerufenen lokalen Zweig einen fernen Zweig hinzuzufügen (so wusste local nicht, dass der Zweig auf dem fernen Zweig 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 entfernten Zweig (ohne Abrufen) hinzuzufügen, indem ich eine neue Kopfdatei bei .git/refs/remotes/Origin/remotebranchname
hinzufügte und dann den Verweis kopierte (Augenzwinkern war am schnellsten, so lahm es war ;-) vom System) mit Zugriff auf das Origin-Repo auf die Workstation (mit dem lokalen Repo, auf dem ich den Remote-Zweig hinzugefügt habe).
Sobald dies erledigt war, konnte ich git branch --set-upstream-to=Origin/remotebranchname
verwenden.
oder einfach per:
wechseln Sie in den Zweig, wenn Sie noch nicht dort 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 du bist bereit für:
[za]$ git Push Origin branch_name
Sie können sich die Konfigurationsdatei ansehen, um zu sehen, was verfolgt wird, indem Sie Folgendes ausführen:
[za]$ git config -e
Es ist auch schön zu wissen, dass es zeigt, welche Zweige verfolgt werden und welche nicht. :
[za]$ git remote show Origin
Für alle, die wie ich nur Ihren lokalen Filialnamen mit dem Namen der entfernten Filiale synchronisieren möchten, gibt es folgenden praktischen Befehl:
git branch -u Origin/$(git rev-parse --abbrev-ref HEAD)