Um in Github z.B. einen Pull Request für ein fremdes Projekt (Git-Repo) zu erstellen, muss in einem ersten Schritt ein Fork des Git-Repos erzeugt werden.
In diesem Fork kann man schließlich seine Änderungen integrieren. Am besten nutzt man dafür einen für diesen Zweck neu angelegten Branch, so dass man unterschiedliche Änderungen voneinander separieren kann und in Form einzelner Pull Requests an das Ursprungsprojekt distributieren kann.
Irgendwann wird es nun vorkommen, dass der eigene Fork nicht mehr mit dem aktuellen Zustand des Git-Repos übereinstimmt, aus dem er erzeugt wurde. In diesem Fall zeigt einem Github die Meldung
This branch is 42 commits behind fooproject:master
an. Leider bietet die Github-Web-UI keine Funktion an, um einen Branch des Fork mit einem Branch des originalen Git-Repo zu synchronisieren.
Daher muss man die Konsole bemühen und folgende Schritte durchführen, wobei der erste
Schritt (git remote …
) nur einmalig durchgeführt werden muss.
Im Folgenden sei angenommen, dass wir den Branch foo-branch
des Forks mit dem
Branch bar-branch
des originalen Git-Repos synchronisieren wollen, i.d.R. wird
bar-branch
der master
-Branch sein.
# neues remote mit dem Namen upstream anlegen
$ git remote add upstream https://github.com/$ORIGINAL_OWNER/$ORIGNAL_REPO.git
# Prüfung, ob der vorherige Befehl erfolgreich war (bzw. obsolete ist)
# in der Ausgabe sollte nun das upstream repo erscheinen (neben dem origin repo)
$ git remote -v
# branches und enthaltene Commits aus upstream laden
$ git fetch upstream
# auf den Branch foo-branch von origin wechseln
$ git checkout foo-branch
# Merge durchführen, d.h. foo-branch des Forks mit dem
# Branch bar-branch des Upstream-Repo synchronisieren
# hierbei werden lokale Änderungen NICHT überschrieben
$ git merge upstream/bar-branch
# Änderungen im foo-branch des Forks auf Github übertragen
$ git push
# Tags aktualisieren (aus dem upstream Repo)
$ git push --tags
In der Github-Web-UI sollte nun nach Auswahl des foo-branch
die Meldung This branch is even with $ORIGINAL_OWNER:master erscheinen, sofern
bar-branch
durch master
ersetzt wurde.
Damit entspricht der Stand im Branch foo-branch
des Forks dem Stand
des Branch bar-branch
im Original-Repository.