Verteilte Versionskontrolle

Softwareentwicklung im Team erfordert ein System zur Versionskontrolle. git gilt heute als Standard. Mit github stellt Microsoft Server zur Verfügung. Eine Alternative, die auch in der Schule eingesetzt werden kann, ist z. B. gitea, das als Server auf eigenen Rechnern installiert werden kann.

Das Repository

In git wird ein Verzeichnis mit allen darin enthaltenen Unterverzeichnissen und Dateien unter Versionskontrolle gestellt. Ein solches Verzeichnis nennt man repository, es stellt eine zusammenhängende Einheit dar und sollte alle zum Projekt gehörenden Dateien enthalten.

Den Kern stellen die Quellcode-Dateien des Software-Projektes dar. Der Zweck von git und github (bzw. gitea) beschränkt sich im Wesentlichen auf das Entwickeln von Quellcode, der mithilfe von Texteditoren erstellt wird. Die Repositories sind weniger geeignet zum Speichern und Teilen großer Datenmengen, umfangreichen Medien-Inhalte, Office-Dokumente und Anwendungsprogramme sollte man über andere Cloud-Systeme verwalten.

Grundlegende Befehle

Nach der Installation von git sollte man als allererstes seinen Namen und seine E-Mail-Adresse in Git konfigurieren. Das ist insofern wichtig, da jeder Git-Commit diese Informationen verwendet. Damit ist später im Team nachvollziehbar, wer welche Änderungen im Repository vorgenommen hat.

git config --global user.name "<Name>"
git config --global user.email <Mail>

Beispiel:

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

Die git Konfiguration kann man anzeigen lassen mit dem Befehl

git config --list

Ein Verzeichnis erstellen und unter Versionskontrolle stellen:

git init <repo>

Beispiel:

git init test

erzeugt ein Unterverzeichnis test und stellt dieses unter Versionskontrolle.

Eine lokale Kopie eines entfernten Repositories erstellen:

git clone <repo>

Das entfernte Repository wird über eine URL adressiert.

Beispiel:

git clone https://github.com/kwollw/wbinf2024.git

erzeugt eine lokale Kopie des Repositories.

Inhalte des Repositories ändern

Textdateien, die mit einem Texteditor erstellt oder verändert wurden, durchlaufen mehrere Stadien der Versionskontrolle.

  1. Dateien werden mit einem Texteditor erstellt oder bearbeitet und gespeichert. git registriert in der Datenbank des repositories, welche Dateien geändert oder hinzugefügt wurden.

  2. Aus der Liste der geänderten Dateien wird eine Auswahl für einen sogenannten Commit vorgemerkt. Dieser Zustand heißt staged.

    git add <file>
    

    merkt eine Datei in dem aktuellen Verzeichnis für den nächsten Commit vor.

    Beispiel:

    git add myfile.html
    

    fügt die Datei myfile.html zu der Liste der vorgemerkten Dateien hinzu.

  3. Dateien auf der Stage werden commited. Damit wird ein Versionsstand (snapshot) festgehalten, auf den man zu einem beliebigen späteren Zeitpunkt zurückgreifen kann. Alle commits werden mit einem Kommentar versehen, sodass man aus der Liste der commits ggf. zielgerichtet einen früheren Zustand auswählen kann. Mit der Liste der Commits hat man einen Überblick über den Entwicklungsprozess und es ist ersichtlich, welche Mitglieder des Teams welche commits erstellt haben.

Ein commit erstellen:

git commit -m "comment"

Beispiel:

git commit -m "typos removed"

erstellt einen commit mit dem Kommentar typos removed

🎓 Übung 1

  • Konfiguriere git mit Namen und email-Adresse
  • Erstelle eine lokale Kopie des Repositories https://github.com/kwollw/wbinf2024.git. Da es sich um ein nicht öffentliches repository handelt, wirst du aufgefordert, dich zu legitimieren. Dazu benötigst du ein personal access token von github, dass du nach dieser Anleitung erstellen kannst.
  • Füge in dem Verzeichnis Lehrkräfte einen Unterordner mit deinem Namen ein.
  • Erzeuge in deinem Unterverzeichnis eine leere Datei “Readme.md”.
  • Bearbeite die Datei, indem du einen Text einfügst.
  • Stage und comitte deine Änderungen.

Dateien mit der Endung .md sind sogenannte Markdown-Dateien. Markdown ist eine vereinfachte Auszeichnungssprache, die eine formatierte Ausgabe mithilfe weniger Auszeichnungszeichen erlaubt.

Empfohlene Vorgehensweise zu commits

  • Regelmäßig commits machen. Jede in sich geschlossene Änderung sollte mit einem separaten Commit abgeschlossen werden. Das kann durchaus mehrere Dateien betreffen. Der Kommentar sollte die Änderung möglichst präzise beschreiben.
  • Commits nur von lauffähigem Code erstellen. Damit wird verhindert, dass andere Teammitglieder mit dem Problem von Programmabbrüchen konfrontiert werden, die sie selbst nicht verursacht haben.

Kollaboration

Im Team zusammenarbeiten heißt, Zustandsänderungen des gemeinsamen Repositories so zu verwalten, dass Inhalte über ein Cloud-Repository ausgetauscht werden. Dabei ist es erforderlich, dass Änderungen an denselben Dateien so behandelt werden, dass Bearbeitungs-Konflikte vermieden bzw. zielgerichtet gelöst werden.

Das gemeinsame Repository (origin) befindet sich auf einem zentralen Server, z.B. bei github oder auf dem gitea-Server.

Kopien (local) werden als Clone auf dem lokalen Rechner erstellt. Änderungen nimmt man in der Regel auf dem lokalen Repository vor.

Zur Synchronisierung der Änderungen ist zu bedenken, dass Mitglieder des Teams unabhängig voneinander Änderungen an ihren lokalen Kopien vornehmen.

Nach einem Commit muss dieser auf das gemeinsame Repository (origin) übertragen werden. Zuvor sollte man aber Änderungen von origin in das lokale Repository übernehmen. Mit einem pull werden Änderungen von origin bezogen (fetch) und in das lokale Repository eingefügt (merge).

git pull

Der merge-Prozess fügt nicht nur neue Dateien ein oder löscht diese. Partielle Änderungen von Dateien werden so zusammengefügt, dass local changes und remote changes innerhalb der Datei zusammengefügt werden.

Voraussetzung für einen konfliktfreien Pull ist, dass alle lokalen Änderungen commited sind.

Mit einem push werden lokale Änderungen auf das gemeinsame Repository (origin) übertragen und eingefügt (merge).

git push

Auf dem Server werden mit dem push die commits auf die gleiche Weise mit einem merge eingefügt, wie bei einem pull auf dem lokalen repository.

🎓 Übung 2

  • Aktualisiere dein lokales Repository mit einen pull.
  • Aktualisiere das origin Repository mit einem push.

Empfohlene Vorgehensweise beim Synchronisieren

  • Halte die Reihenfolge ein: Erst alle Dateien speichern, stagen und committen, dann pull ausführen und ggf. Konflikte bearbeiten, zuletzt mit push die Synchronisierung abschließen.

Weiterführende Techniken

Branches

Branches stellen unabhängige Entwicklungspfade dar. Für eine spezielle Aufgabe kann man einen branch erstellen, der die ursprüngliche Version (main oder master) nicht verändert. Zu einem späteren Zeitpunkt kann man die commits aus einem Branch in den main-Branch übertragen (merge) oder auch wieder verwerfen.

Merge-Konflikte

Lassen sich commits nicht automatisch mergen, muss ein merge-Konflikt bearbeitet und gelöst werden.

Nutzung von git innerhalb von Visual Studio Code

Visual Studio Code hat eine Integration von git, mit der die git-Befehle direkt aus VSCode ausgeführt werden können.

🎓 Übung 3

  • Füge in dem Repository eine weitere Datei ein.
  • stage und committe in dem source controlFenster von Visual Studio Code
  • Synchronisiere mit dem origin Repository.

Quellen

GitHowTo is a guided tour that walks through the fundamentals of Git.