21. November 2013

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:

Remote

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

Remote Tracking Branch

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

  1. Erstellen Sie einen neuen github-Account und lassen Sie sich als Collaborator für das Test-Projekt http://github.com/ralfebert/testrepo eintragen.

  2. Fügen Sie die Repository-URL als Remote origin hinzu:

    git remote add origin git@github.com:ralfebert/testrepo.git
  3. 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
  4. Pushen Sie diesen Branch in das Remote-Repository:

    git push origin feature_xy
  5. Commiten Sie eine Änderung in dem Branch und übertragen Sie diese mit git push ebenfalls zum Remote-Repository.

  6. 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
  7. Lassen Sie alle lokalen Branches und Remote Tracking Branches anzeigen:

    git branch -av