Git Workflow

Beschreibung: Mit Git arbeiten

Kategorie: Extensions, Lexikon, Git

Link zu diesem Artikel: Alles auswählen

[url=https://www.phpbb.de/kb/viewarticle?a=34]Knowledge Base - Git Workflow[/url]

Dieser Artikel setzt voraus, dass Git wie in Git, TortoiseGit und Github installieren und einrichten. beschrieben aufgesetzt wurde.

Grundlegende Arbeitsweise mit Git

Ein VCS wie Git kann verwendet werden, um die komplette Versionshistorie einer Software nachzuhalten und zu speichern (siehe Git, TortoiseGit und Github installieren und einrichten. für weitere Vorteile der Verwendung von Git). Auch wenn es möglich ist dies manuell durchzuführen (indem man z.B. jede Version in einem eigenen Ordner archiviert) nimmt einem Git hierbei eine Menge Arbeit ab und vermeidet Fehlerquellen.

Die grundlegenden Dinge, die man üblicherweise mit Git durchführt sind die folgenden:
  • Einrichten des Repositories (einmalig):
    • Es soll mit bereits existierender Software in einem fremden Repository gearbeitet werden: git clone (ggf. mit vorherigem Fork auf Github)
    • Ein komplett neues Projekt: git init
  • Übertragen der Änderungen von anderen Repositories: git pull
  • Übernehmen der Änderungen in eigene Entwicklungen: git merge
  • Einpflegen eigener Änderungen: git commit
  • Hochladen der eigenen Änderungen in ein anderes Repository:
    • Es handelt sich um ein eigenes Repository (z.B. eine öffentliche Kopie auf Github): git push
    • Es handelt sich um ein fremdes Repository für dass Änderungen vorgeschlagen werden: Pull request abschicken
Diese einzelnen Punkte werden im Folgenden am Beispiel eines Repositories auf github ausführlicher beschrieben.

Mit Git, TortoiseGit und Github arbeiten

Im Vergleich zu SVN und CVS hat Git einen großen Vorteil: die Verwaltung ist dezentralisiert.
Daraus resultiert zum Beispiel dass man zum Commiten von Änderungen nicht zwingend Internetzugriff benötigt. Der Nachteil davon ist allerdings, dass die Verwaltung etwas komplizierter wird. Aber fangen wir von vorne an.
Im folgenden wird das Repository der deutschen phpBB-Dokumentation als Beispiel benutzt. Wir gehen davon aus, dass ihr Änderungen an der Dokumentation umsetzen wollt und diese Änderungen anschließend zur Übernahme in das zentrale Repository vorschlagen wollt (dies funktioniert natürlich mit jedem beliebigen anderen Repository genauso).

Repositories forken

Als erstes müsst ihr das Repository der Dokumentation forken. Dazu geht ihr auf Github https://github.com/phpbb-de/documentation und benutzt den Fork-Button oben rechts. Dabei wird das aktuelle Repository so wie es ist in euren Account kopiert. Zukünftig neue Änderungen werden nicht automatisch in eurem Repository auftauchen. Siehe Änderungen aus anderen Repositories kopieren weiter unten.

Repository clonen

Als nächstes müsst ihr das Repository was ihr gerade auf Github erstellt auf euren Computer clonen (ähnlich SVN Checkout). Die Clone-URL dafür steht auf der Github Seite des jeweiligen Repositories. Im Fall der Doku wäre das git@github.com:phpbb-de/documentation.git. Wenn ihr die URL habt, geht ihr einfach in den Ordner wo ihr das Repository hinspeichern wollt und macht dort einen Rechtsklick > Git Clone. Wenn ihr Änderungen an das Repository senden wollt und TortoiseGit benutzt, müsst ihr mit der Option "Load Putty Key" dabei noch angeben, dass euer Privater Schlüssel automatisch geladen wird.
Wenn ihr das Repository jetzt klont und davor noch kein anderes von github.com geklont habt, kommt die folgende Meldung:
The server's host key is not cached in the registry. You have no guarantees that the server is the computer you think it is.
...
Die Meldung könnt ihr einmal mit Ja bestätigen, ansonsten werdet ihr jedes Mal gefragt ob der Adresse vertraut werden soll.

Änderungen aus anderen Repositories kopieren

Um Änderungen die nach eurem Fork im originalen Repository (Remote genannt) gemacht wurden in euer Repository zu übernehmen, müsst ihr einen Git Pull machen. Dazu macht ihr einfach einen Rechtsklick im gewünschten Repository, TortoiseGit > Pull. Dort wählt ihr dann das gewünschte Remote aus (wo die gewünschten Änderungen enthalten sind) und anschließend noch den Remote-Branch.
Allerdings werden dort nur euer eigenes Remote oder solche angezeigt, die ihr manuell eingetragen habt. Um weitere Remotes hinzuzufügen, geht ihr einfach in euren Ordner, Rechtsklick > TortoiseGit > Settings > Git > Remotes. Dort tragt ihr einfach die Daten ein und drückt dann auf Add New/Save. Zum Beispiel könnt ihr so phpBB.de und phpBB.com als Remotes hinzufügen:
  • phpBB.de (nur lesend):
    git://github.com/phpbb-de/documentation.git
  • phpBB.de (lesend und schreibend - geht nur für freigegebene Nutzer):
    git@github.com:phpbb-de/documentation.git
  • phpBB.com (nur lesend):
    git://github.com/phpbb/documentation.git
  • phpBB.com (lesend und schreibend - geht nur für freigegebene Nutzer):
    git@github.com:phpbb/documentation.git
Die Daten dafür findet ihr sonst auch wieder auf den jeweiligen github Seiten.

Änderungen zusammenführen

In den meisten Fällen führt git pull automatisch zu einer Änderung der lokalen Dateien - die Änderungen aus den anderen Repositories werden automatisch übernommen. Genau genommen wird an dieser Stelle ein git merge vorgenommen, d.h. Änderungen an der selben Datei in verschiedenen Repositories werden automatisch zusammengeführt in eine neue Datei mit allen Änderungen. Es ist ebenfalls möglich mehrere eigene Entwicklungszweige auf die gleiche Weise wieder zusammenzuführen und so z.B. Tests erst mal in einem Nebenzweig durchzuführen bevor man sie in den Hauptzweig übernimmt.

Manchmal führt das Zusammenfügen von Änderungen zu Konflikten. Dies kann z.B. dann passieren, wenn mehrere Änderungen die gleiche Zeile betreffen oder wenn eine Binärdatei in mehreren zusammenzuführenden Zweigen geändert wurde. In dem Fall kann Git nicht entscheiden, was die "richtige" Version ist und es meldet stattdessen einen Konflikt. Tortoise Git bietet allerdings bei einem Doppelklick auf die gemeldete Datei eine Übersicht, in der man beide Versionen der Datei begutachten kann und auf diese Weise für jede Zeile individuell entscheiden kann, welche Variante korrekt ist um den Konflikt auf diese Weise aufzulösen. Anschließend kann man per git commit die Änderungen übernehmen.

Änderungen einpflegen

Nun, da alle Änderungen in euer Repository übernommen wurden, könnt ihr die Dateien wie gewünscht ändern. Wenn ihr fertig damit seid, macht ihr einen so genannten Commit, Rechtsklick > git commit. Damit sind die Änderungen aber bisher nur auf eurem Computer. Um sie nun auch auf euren Github-Account zu übertragen müsst ihr nun einen Push machen, Rechtsklick > TortoiseGit > git push.

Änderungen vorschlagen

Wenn ihr nun die Änderungen in eurem Repository gemacht habt, aber auch wollt das die Änderungen in der Dokumentation von phpBB.de enthalten sind, müsst ihr einen sogenannten Pull-Request schicken. Dazu geht ihr einfach auf die Seite eures Repositories, in meinem Fall also https://github.com/nickvergessen/documentation und drückt dort auf Pull Request. Anschließend könnt ihr noch den Branch auswählen, in welchem ihr die Änderungen habt und wo sie im Repository von phpBB.de eingepflegt werden sollen. Im Falle der Dokumentations-Übersetzung wäre das der Branch intl-de. Das Übersetzer-Team wird dann eure Änderungen kontrollieren und wenn alles in Ordnung ist in das Repository mergen.
Wenn die Änderungen gemerged wurden, müsst ihr diese dann wieder wie im Abschnitt Änderungen aus anderen Repositories kopieren beschrieben in euer Repository kopieren.


Als Orientierung diente der folgende Blog-Eintrag:
http://www.informatik.uni-leipzig.de/~g ... ByStep.pdf