blob: be948846fd6f6245264efa2c1d01f777380562ae [file] [log] [blame]
Git workflow
============
Typischer Arbeitsablauf
-----------------------
(Es gibt andere Arbeitsweisen, aber dies hier ist eine, die sich bewaehrt
hat.)
Nehmen wir an, ich moechte etwas neues einbauen, einen Bug fixen etc.
Alle der folgenden Schritt werden auf eurem eigenen Rechner in eurem lokalen
Clone des jeweiligen Repositories durchgefuehrt.
1. Repository clonen und/oder updaten::
git clone ssh://mgg/dings/bums
git checkout master
git pull
Zuerst einmal wird ein checkout des Zweiges 'master' gemacht. Und in diesen
Zweig hol ich mir erstmal den aktuellen Stand aus dem Mud (pull).
Jetzt moechte ich alle Aenderungen erstmal in einem separaten Zweig machen.
Warum? Weil dann der 'master' (das ist der aktive Zweig im Mud!) immer in
einem benutzbaren Zustand ist. Desweiteren kann man einen Zweig einfach
wegwerfen, wenn irgendwas groesseres schiefgelaufen ist...
Ausserdem ist es dann einfacher, zwischenzeitliche Aenderungen aus dem Mud zu
integrieren.
2. Neuen Zweig erstellen::
git checkout -b neue_kampftaktik
Hiermit wird ein neuer Zweig erstellt und gleichzeitig in ihn gewechselt.
Hier mach ich jetzt alle moeglichen Arbeiten und Basteleien, die ich fuer die
neue Kampftaktik brauche. Tipps dazu:
* Viele und haeufige Commits machen! Je kleiner einzelne Commits sind,
desto besser kann man Aenderungen spaeter verfolgen (was z.B. super ist,
wenn jemand was abnehmen muss!) und desto besser kann man einzelne
Aenderungen spaeter bei Bedarf auch rueckgaengig machen, wenn man merkt,
dass man stellenweise Unsinn gebaut hat. ;-)
* Thematisch unterschiedliche Dinge in verschiedene Commits packen. Also
z.B. erst Syntaxfehler editieren und commiten, dann eine neue Methode
fuer etwas ganz andere schreiben und commiten.
3. Aenderungen pruefen und commiten
Hiermit lasse ich mir anzeigen, welche Dateien nicht-committete Aenderungen
enthalten (oder neu sind/geloescht wurden)::
git status
Dies zeigt mir alle nicht-committeten Aenderungen an - zeilenweise
verglichen mit dem vorherigen Zustand::
git diff
4. Aenderungen in lokales Repository commiten
Hiermit merke gemachten Aenderungen fuer den naechsten Commit vor.
Ich kann hier einzelne Dateien auswaehlen, bestimmte Dateien oder sogar nur
bestimmte Teile der Aenderungen in einer Datei. (Hierzu bitte die
Git-Doku bemuehen.)::
git add <file> // einzelne Files auswaehlen
git add -A ./ // alle Files auswaehlen
Hiermit erstelle ich einen Commit, der die bisherigen Aenderungen umfasst.
Dabei wird ein Editor geoeffnet, in den ich eine informative Nachricht
ueber meine Aenderungen hinterlassen kann. Das ist besonders wichtig, wenn
ich in fremden Gebieten arbeite, aber auch fuer mich und einen etwaigen
abnehmenden Magier sehr sinnvoll.
Anregung: Die erste Zeile ist das sog. Betreff des Commits - vergleichbar
mit dem Betreff einer eMail. (bitte nur so 50-60 Zeichen). Anschliessend
muss eine leere Zeile folgen und danach eine laengere Beschreibung eingeben
werden::
git commit
Wenn ich an diesem Punkt mit dem Bugfix oder Feature noch nicht fertig bin:
einfach den Schritt 4 beliebig oft wiederholen, d.h. beliebig viele weitere
Commits machen.
5. Aenderungen in lokalen Master-Zweig mergen
Bin ich dann schliesslich aber mal fertig, gehe ich erstmal zurueck zum
master-Zweig::
git checkout master
Huch! Ploetzlich sind alle Dateien auf dem alten Stand! Keine Sorge,
unsere Aenderungen sind im Zweig 'neue_kampftaktik' sicher verwahrt.
Achtung: wenn ihr mit anderen zusammen arbeitet, koennte jemand
anderes im MUD Aenderungen vorgenommen haben. Ein einfaches ``git pull``
um die Dateien im 'master'-Zweig auf den neuesten Stand zu bringen,
zeigt euch auch Aenderungen. Wenn da jetzt
``Already up-to-date.`` steht, ist alles in Butter, ansonsten siehe unten.
Mit diesem Kommando hole ich nun alle Aenderungen aus meinem Zweig
'neue_kampftaktik' in den Zweig 'master' (merge)::
git merge neue_kampftaktik
6. Aenderungen in das MUD-Repository uebertragen
Jetzt bin ich bereit, die Aenderungen ins Mud zu uebertragen::
git push origin <lokaler_zweigname>:<zweigname_im_mg>
Job done!
(Hinweis: nur der Branch "master" wird ins Mud selber synchronisiert, alle
anderen Zweige existieren nur in den git-Repositories.)
Sonderfaelle und erweiterte Moeglichkeiten
------------------------------------------
A) Zwischenzeitliche Aenderungen im MUD beruecksichtigen
Es koennte sein, dass man fuer den Branch ne ganze Weile gebraucht hat -
und dass waehrend meiner Arbeit jemand anders Aenderungen (im Mud oder
Repo) gemacht hat.
Diese Aenderungen sollte man sich wie geschrieben als erstes nach dem
Umschalten zum master-Zweig holen::
git pull
Jetzt geh ich wieder in meinen Zweig (ohne -b)::
git checkout neue_kampftaktik
und mache ein sog. Rebase. Damit verschiebe ich sozusagen, den Punkt, an dem
mein Zweig vom 'master' abzweigt und tue so, als ob die eben geholten
Aenderungen schon da gewesen waeren, als ich den Zweig erstellte.
(Andere Sichtweise: ich nehme meine Zweig und setz ihn auf den aktuellen
'master' dran.)::
git rebase master
Der Vorteil ist: wenn jetzt was kaputt gegangen ist, es also Konflikte gibt,
dann gibt es die nur in meinem Zweig 'neue_kampftaktik' und dort kann ich
sie in aller Ruhe reparieren. Sowohl der 'master' im MUD als auch mein
lokaler 'master' sind intakt.
Und jetzt geht es wie oben weiter.
SIEHE AUCH
----------
* gerrit
* Doku von Gerrit:
* https://mg.mud.de/gerrit/Documentation/intro-user.html
* https://mg.mud.de/gerrit/Documentation/index.html#_tutorials
* `gerrit-upload`: Wie man Dinge in Gerrit hochlaedt
* git-howto: Wie git benutzt wird
* git-kooperation: Ein ueber git-workflow hinausgehendes Beispiel zur
Synchronisation bzw Kooperation mehrerer Magier/Rechner
* gerrit-sync: Wie die Synchronisierung zw. git-Repos und Mudlib ablaeuft
* git-faq: haeufig gestellte Fragen/Probleme