
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

   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
==========================================

1. 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*

   * 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
