Einheit 1: Git

In der ersten Einheit wird Git behandelt, weil Git für die Verwaltung des Linux Kernels entwickelt wurde. Nein, im Ernst, Git ist ein grundlegendes Werkzeug für Software-Entwickler und daher relevant.

Lernziele

  • Hintergründe, Sinn und Zweck von Versionsverwaltung kennenlernen

  • Git Grundlagen kennenlernen und anwenden können

  • Verstehen warum Git Workflows hilfreich sind

Warum Versionsverwaltung?

Es gibt alternative Bezeichnungen:

  • Version Control Systems (VCS)

  • Source Control Management (SCM)

  • Revision Control Systems (RCS)

Herausforderung bei der Verwaltung von Quell-Code:

  1. Software-Projekte können schnell sehr groß und unübersichtlich werden und hunderte bzw. tausende von Code-Dateien enthalten.

  2. Sehr viele Entwickler (2, 10, hundert, oder sogar tausend) können an einem Projekt beteiligt sein.

Versionsverwaltungen können helfen diese Komplexität in den Griff zu bekommen, indem die Änderungen an den Dateien über die Zeit hinweg protokolliert werden.

Versionsverwaltungen lassen pro Datei die Änderungen nachvollziehen. Das heißt: wer hat was wann geändert.

So eine Historie ist auch für einzelner Entwickler sinnvoll:

  • Änderungen über die Zeit nachvollziehen

  • "Zurückrollen" zu einem bestimmten Zeitpunkt

  • Löschen ohne Reue

Was wäre bei einem Entwickler die Alternative?

Viele (sehr viele) Kopien einer Datei anfertigen: jeden Tag, nach jeder Änderung. Wie werden die Änderungen protokolliert? Wie kann man das bei sehr vielen Dateien praktikabel gestalten.

Bei mehreren Entwicklern kommen weitere Herausforderungen hinzu:

  • Wie kommen die anderen -Entwickler

  • Wie kann man sehen, wer welche Änderungen gemacht hat

  • Wie lassen sich Konflikte auflösen, wenn mehrere Entwickler Änderungen an der gleichen Datei (insb. der gleichen Zeile) durchgeführt haben?

Was wäre die Alternative? Code-Dateien per E-Mail verschicken?

Versionierung von Quell-Code erlaubt all die zuvor genannten Probleme zu lösen, außerdem lässt sich der

  • Zustand eines Projekts wiederherstellen: zum Testen, für ein Release oder um die Einführung eines Fehlers zu finden bzw. den Bug zu beheben.

Was nutzen Entwickler?

Eine kurze Geschichte von Git

  • Linux Community nutzte BitKeeper zur Verwaltung des Kernel Source Codes

  • Durch Lizenzänderung des Herstellers konnte BitKeeper nicht mehr genutzt werden

  • Linus Torvalds wollte ein System, das ähnlich BitKeeper funktionierte, aber die Nachteile der anderen Systeme nicht mehr aufwies (z.B. lange Zeiten bei Branches durch Kopieren aller Dateien)

  • Innerhalb weniger Tage wurde die erste Version von Git entwickelt:

    • April 2005 Ankündigung des Projektes

    • April 2005 Self-Hosting des Projektes

    • Juni 2005 wurde der Linux 2.6 Kernel bereits durch Git verwaltet

Git Grundlagen

  • Git Repository: Vereinfacht ausgedrückt, ein Verzeichnis, in dem die Dateien “überwacht” werden

  • Metadaten (einschl. der Historie) werden in einem versteckten Unterverzeichnis .git verwaltet.

  • Git ist eine verteilte Versionsverwaltung

  • Keine Notwendigkeit eines zentralen Repositories

  • Clonen bzw. Forken eines Repositories legt eine vollständige Kopie an. Änderungen können dann in das ursprüngliche Repository zurückgeführt (engl. merge) werden.

  • Jede Datei in dem überwachten Verzeichnis, befindet sich in einem bestimmten Zustand:

Nützliches für den Einstieg

Lokale Änderungen anzeigen (engl. unstaged changes): git diff [dateiname]

Änderungshistorie: git log für Commits, git –p log für ein Preview

Checkout: Der Checkout einer früheren Version eines Repositories ersetzt alle Dateien mit dieser Version (time travel)

Branches: Alle Änderungen werden in dem Branch (dt. Zweig) gespeichert ohne den Hauptzweig (engl. master od. main branch) zu beeinflussen („kaputt zu machen“)

Remote: “Entfernte“ Kopie eines Repositories (z.B: GitLab, GitHub) – Achtung: Selbst auf GitLab/GitHub ist nicht das zentrale Repository, sondern nur eine entfernte Kopie Synchronsiation mit dem lokalen Repository z.B. mit git push, git pull

Stash: Änderungen, die noch nicht committet wurden, können mit git stash „zwischengespeichert“ und mit git stash apply wieder hergestellt werden

Fork: Server-seitiger Clone eines Repositories (vorrangig auf GitHub genutzt)

Git Workflows

Trotz oder gerade wegen der verteilten Verwaltung kann so einiges schief gehen. Auch wen auf dem main bzw. master immer zurückgerollt werden kann, gilt:

Das Team hält sich an spezielle Regeln, wann neue Branches erzeugt werden und wann diese wieder zurück in den master bzw. main gemerged werden dürfen.

Das Ziel ist immer das gleiche: Der master bzw. main soll zu jeden Zeitpunkt stabil sein, d.h. im besten Fall für den fehlerfreien Build einer aktuellen und lauffähigen Software verwendet werden können.

Dabie gibt es verschiedene Ansätze für Git Workflows.

  • Centralized Workflow

  • Feature Branch Workflow

  • Gitflow

  • Fork & Merge

  • Microsoft Git Branching Strategy

In GitOps wird ein anderer Ansatz verfolgt: Hier werden möglichst alle Änderungen direkt im master/main durchgeführt. Dies ist aber nur durch einen sehr hohen Grad an Automatisierung im Build- und Testprozess möglich. Teaser: Das wird in der Vorlesung DevOps behandelt und spielt zunächst keine Rolle für uns.

Aufgaben

  1. Stellen Sie sicher, dass Git auf Ihrem Rechner vorhanden ist

  2. Sofern Sie noch keinen Zugang um Hochschul-GitLab haben, melden Sie sich dort einmalig an. Hinweise: Sie erhalten beim ersten Versuch eine Fehlermeldung, dadurch lern das System jedoch Ihren Account kennen und Sie können einem Repository zugewiesen werden.

  3. Finden Sie ein Team-Mitglied (2er-Gruppen). Laden Sie in ILIAS unter Abgaben eine JSON-Datei in folgendem Format hoch.

    {
        "name": "",
        "members": [
          {
              "lastname": "Mustermann",
              "firstname": "Max",
              "id": 12345,
              "email": "maxmu@stud.hs-heilbronn.de"
          },
          {
              "lastname": "Musterperson",
              "firstname": "Maxi",
              "id": 676890,
              "email": "maxim@stud.hs-heilbronn.de"
          },
        ]
     }

    Im Laufe des Tages erhalten Sie von GitLab das Benachrichtigen über Ihr Repository.

Hausaufgabe

Git Grundlagen Sofern noch nicht geschehen, erarbeiten Sie den Kurs Version Control with Git bis zum übernächsten Termin.

Git Übung Erstellen Sie über Git-Commits ein Dialog aus Shakespear`s "Rome und Julia". Am Besten erarbeiten Sie diese Aufgabe bereits im Team, da beide Team-Mitglieder abwechselnd einchecken müssen.

Nutzen Sie Git-Befehle wie git add, git commit, git push, git pull und git log, um ihre Änderungen zu verwalten und den Dialog im Verlauf des Git Logs nachzuvollziehen.

Folgender Dialog ist über Commit-Messages und Commits im Log zu erstellen:

Romeo: Ist es Tag?

Julia: Nein, es ist die Nachtigall, die den Morgen anzeigt, nicht die Lerche, deren Pfeifen das Wachstum des Tages weckt. Jocund Day steht auf der Jagd und weckt die Jagd.

Romeo: Weil sie sich in ihren Augen widerspiegeln würde, bis ich die Rückkehr von Lucentio sehe, Ich will dir mit meinen Augen zeigen, was Shakespeare sagt: „Guten Tropfen Salz“, du vergisst dann schnell.

Julia: Nun, da du willst, werde ich dich vergeben, Wenn du mir gehorchst liebevoll. Willkommen wird der Regen bald nachlassen.

Romeo: Meine Ehegatten hätten eine bessere Erscheinung, wenn es nicht für die Zähne wäre, die den weißen Verstand einfärben. Wir haben gute Absichten, zu schlafen.

Das Commit log soll am Ende so aussehen (via git log):

commit c9a3e2e (HEAD -> main)
Author: Romeo <romeo@example.com>
Date:   Thu Mar 10 12:00:00 2024

    Romeo: Ist es Tag?

commit a7f8d4b
Author: Julia <julia@example.com>
Date:   Thu Mar 10 11:50:00 2024

    Julia: Nein, es ist die Nachtigall, die den Morgen anzeigt,
          nicht die Lerche, deren Pfeifen das Wachstum des Tages weckt.
          Jocund Day steht auf der Jagd und weckt die Jagd.

commit f32e89d
Author: Romeo <romeo@example.com>
Date:   Thu Mar 10 11:40:00 2024

    Romeo: Weil sie sich in ihren Augen widerspiegeln würde,
          bis ich die Rückkehr von Lucentio sehe,
          Ich will dir mit meinen Augen zeigen,
          was Shakespeare sagt: „Guten Tropfen Salz“,
          du vergisst dann schnell.

commit b57a6c1
Author: Julia <julia@example.com>
Date:   Thu Mar 10 11:30:00 2024

    Julia: Nun, da du willst, werde ich dich vergeben,
          Wenn du mir gehorchst liebevoll.
          Willkommen wird der Regen bald nachlassen.

commit e1c4d77
Author: Romeo <romeo@example.com>
Date:   Thu Mar 10 11:20:00 2024

    Romeo: Meine Ehegatten hätten eine bessere Erscheinung,
          wenn es nicht für die Zähne wäre, die den weißen Verstand einfärben.
          Wir haben gute Absichten, zu schlafen.

Stellen Sie sicher, dass sich im Root-Verzeichnis Ihres Repositories eine Datei dialog.txt befindet, in der die jeweiligen Text-Passagen eingecheckt sind. Die Textpassagen entsprechend der jeweiligen Log-Message.

Weiterführendes Material

Git

Misc

Last updated