Remotes, Remote-Tracking-Branches, Push/Fetch
In einem Git-Repository können die Branches eines anderen Git-Repository verfolgt werden. Dazu wird in dem lokalen Repository die URL des zu verfolgenden Repositories unter einem Namen als Remote eingetragen. origin ist dabei der Standard-Name für ein solches Remote. Zum Beispiel:
$ git remote add <name> <url> # Repository <url> als Remote <name> hinzufügen
$ git remote add origin git@github.com:ralfebert/testrepo.git
Mit dem Aufruf von git remote werden alle eingerichteten Remotes angezeigt:
$ git remote -v # Remotes mit URL anzeigen
origin git@github.com:ralfebert/testrepo.git (fetch)
origin git@github.com:ralfebert/testrepo.git (push)
Gehen wir für folgendes Beispiel von einem Themen-Branch feature_xy im lokalen Repository und einem neuen, leeren Remote-Repository aus, das dem lokalen Repository als Remote origin eingetragen wurde:
git push
Ein Branch im lokalen Repository kann mittels git push zu einem Remote-Repository übertragen werden. Zum Beispiel würde folgendes Kommando für den lokalen Branch feature_xy im Remote-Repository einen Branch feature_xy anlegen und alle zugehörigen Commits 1:1 im Remote-Repository replizieren:
$ git push <remote> <branch> # push <branch> to <remote>/<branch>
$ git push origin feature_xy
Remote Tracking Branches und wiederholtes Push
Weiterhin wird dadurch für den Branch ein Remote-Tracking-Branch <remote>/<branch> angelegt, der den Zustand im Remote-Repository abbildet:
# Alle Branches + Remote-Tracking-Branches + letzten Commit anzeigen
$ git branch -avv
* feature_xy [origin/feature_xy] 5f3c99f some commit
remotes/origin/feature_xy 5f3c99f some commit
Wird nun im lokalen Branch weitergearbeitet, wird der Remote-Tracking-Branch unverändert auf den ursprünglichen Zustand im Remote-Repository verweisen:
Die neuen Commits können mit git push zum Remote-Repository übertragen werden. Eine explizite Angabe von Quell- und Zielbranch ist nur beim initialen Push notwendig:
git push
Dadurch werden die noch fehlenden Commits zum Remote-Repository übertragen und der lokale Remote-Tracking-Branch entsprechend aktualisiert:
git fetch
Die lokalen Remote-Tracking-Branches können mit git fetch aktualisiert werden. Dabei werden Änderungen, die zwischenzeitlich von Anderen zum Remote-Repository hin übertragen wurden, in die lokalen Remote-Tracking-Branches übernommen, so dass diese wieder genau den Zustand im Remote-Repository abbilden. Existieren im Remote-Repository Branches, die lokal noch nicht repliziert werden, werden automatisch entsprechende Remote-Tracking-Branches erstellt:
$ git fetch
From github.com:ralfebert/testrepo
* [new branch] feature_ab -> origin/feature_ab
* [new branch] feature_cd -> origin/feature_cd
a4452e9..c8c8187 feature_xy -> origin/feature_xy
$ git branch -a
* feature_xy
master
remotes/origin/feature_ab
remotes/origin/feature_cd
remotes/origin/feature_xy
Aufgaben
-
Erstellen Sie einen neuen github-Account und lassen Sie sich als Collaborator für das Test-Projekt http://github.com/ralfebert/testrepo eintragen.
-
Fügen Sie die Repository-URL als Remote origin hinzu:
git remote add origin git@github.com:ralfebert/testrepo.git
-
Leiten Sie von master einen lokalen Branch feature_xy ab (verwenden Sie für xy Ihre Initialen, so dass es zu keinen Namenskonflikten kommt):
git checkout -b feature_xy master
-
Pushen Sie diesen Branch in das Remote-Repository:
git push origin feature_xy
-
Commiten Sie eine Änderung in dem Branch und übertragen Sie diese mit git push ebenfalls zum Remote-Repository.
-
Aktualisieren Sie die Remote Tracking Branches mittels git fetch, so dass Sie die Branches Ihrer Kollegen lokal als Remote Tracking Branches repliziert bekommen:
git fetch
-
Lassen Sie alle lokalen Branches und Remote Tracking Branches anzeigen:
git branch -av