|

Das Pflegen eines Forks

Das Forken bzw. Klonen eines Git-Projektes auf den bekannten Plattformen wie GitHub, GitLab und Bitbucket ist ein häufiger Vorgang und ein wichtiger Teil der Opensource-Community.

Doch wie kann man einen Fork jederzeit mit Updates vom originalen Projekt weiterpflegen und synchronisieren, falls dort Änderungen sind?

Dies ist über sogenannte Remote-Repositories ganz einfach möglich.
Ein Remote Repository wird in der Regel mit git remote add zum lokalen Projekt hinzugefügt. Diesen Schritt hat man oft ganz am Anfang eines Projektes einmal für origin ausgeführt, damit das lokale Projekt auf das Projekt bei der entsprechenden Plattform zeigt.

Der Befehl sieht so aus:
git remote add <remotename> <url>

Der Name ist beliebig festlegbar und die URL zeigt auf das entsprechende Repository.

Ein konkretes Beispiel sieht so aus:
git remote add upstream git@github.com:magento/magento2.git

Standardmäßig verwende ich den Namen upstream um auf das originale Repository zu zeigen, von dem ich einen Fork erstellt habe.

Danach kann ich auf dem gleichen Branch per git pull upstream branchname die Änderungen von dem festgelegten Remote-Repository upstream holen.

Mit fetch, rebase, merge kann man auf diese Weise relativ einfach den eigenen Fork synchronisieren.

Die originalen Branches sollten entsprechend im Idealfall nicht angetastet werden, oder per merge --ff (fast-forward merge), merge --no-ff (mit Merge-Commit) oder git pull --rebase die Änderungen von upstream integriert werden.

Die Einstellungen für die "Remotes" werden in der Datei .git/config lokal gespeichert.

Zusammengefasst ist das also folgender Ablauf:

git remote add upstream git@...
git pull upstream master

Oder

git fetch upstream master
git rebase upstream master

Optional kann man auch den automatisch angelegten Branch upstream/master direkt verwenden also git rebase upstream/master

Die aktuellen Remote-Repositories inklusive URL kann man sich mit git remote -v auflisten lassen.

Ich hatte das zum Beispiel bei post-mortems in meinem Fork mit den offenen Pull-Requests gemacht, da das Projekt zu der Zeit nicht gepflegt wurde. Ich habe in dem Fall jeden einzelnen Fork des Original-Projektes als Remote-Repository hinzugefügt und den jeweiligen Branch von den Pull-Requests mit merge --no-ff integriert und die gesamten Änderungen beim originalen Projekt als Pull-Request eingereicht.

git remote add matkoniecz git@github.com:matkoniecz/post-mortems.git
git fetch matkoniecz
git merge --no-ff matkoniecz/dedup

git remote add loganmeetsworld git@github.com:loganmeetsworld/post-mortems.git
git fetch loganmeetsworld
git merge --no-ff loganmeetsworld/homebrew

git remote add peterfroehlich git@github.com:peterfroehlich/post-mortems.git
git fetch peterfroehlich
git merge --no-ff peterfroehlich/patch-1

git remote add takirala git@github.com:takirala/post-mortems.git
git fetch takirala
git merge --no-ff takirala/patch-1
git push