EMZETT.
Login

Git

Kurz: Ein verteiltes Versionskontrollsystem, das Änderungen am Quellcode über die Zeit nachvollziehbar macht.

Genauer: Jede Änderung wird als “Commit” gespeichert, wodurch sich der komplette Verlauf eines Projekts rekonstruieren, vergleichen und bei Bedarf rückgängig machen lässt. “Verteilt” bedeutet, dass jede lokale Kopie die volle Historie enthält, nicht nur ein zentraler Server. GitHub und GitLab sind Hosting-Plattformen für Git-Repositories, aber nicht dasselbe wie Git selbst.

Im Detail

Entstehung

Git wurde 2005 von Linus Torvalds (Erfinder von Linux) in nur zehn Tagen geschrieben, nachdem die Linux-Kernel-Entwicklung das bis dahin genutzte proprietäre System BitKeeper nicht mehr kostenlos nutzen durfte. Die Anforderungen kamen direkt aus der Praxis eines der größten Open-Source-Projekte der Welt: tausende gleichzeitige Mitwirkende, hohe Geschwindigkeit auch bei riesigen Historien, und garantierte Integrität (kein manipulierter Commit soll unbemerkt bleiben können). Letzteres erreicht Git dadurch, dass jeder Commit über einen kryptografischen Hash seines gesamten Inhalts UND des Hashes seines Vorgängers identifiziert wird — eine Kette, bei der sich jede nachträgliche Änderung an der Historie sofort durch einen anderen Hash verrät.

Snapshots statt Diffs

Ein verbreitetes Missverständnis: Git speichert NICHT pro Commit nur die Unterschiede (Diffs) zum Vorgänger, sondern jeweils einen vollständigen Snapshot des gesamten Projektzustands (unveränderte Dateien werden dabei intern nur als Referenz auf bereits gespeicherten Inhalt behandelt, nicht dupliziert). Das macht Operationen wie das Auschecken eines beliebigen alten Standes sehr schnell — Git muss keine lange Kette von Diffs nacheinander anwenden, sondern lädt direkt den passenden Snapshot.

Der grundlegende Workflow

git add datei.txt              # Änderung zur "Staging Area" hinzufügen
git commit -m "Fehler in der Berechnung behoben"  # Snapshot erstellen
git push origin main           # lokale Commits zum Remote hochladen

Die Staging Area (auch “Index”) ist eine Git-Besonderheit: Änderungen im Arbeitsverzeichnis werden nicht automatisch committet, sondern erst bewusst per git add vorgemerkt — das erlaubt es, aus vielen geänderten Dateien gezielt nur eine thematisch zusammenhängende Teilmenge in einem Commit zu bündeln, statt zwangsläufig alles auf einmal zu committen.

Branches: billige, bewegliche Zeiger

Ein Branch ist technisch nichts weiter als ein beweglicher Zeiger (eine kleine Textdatei mit einem Commit-Hash) auf einen bestimmten Punkt der Historie — das Erstellen eines neuen Branches ist deshalb eine praktisch kostenlose Operation, egal wie groß das Repository ist. Das ermöglicht den in der Praxis üblichen Workflow: Für jedes Feature/jeden Bugfix einen eigenen Branch von main abzweigen, isoliert daran arbeiten, und die Änderungen per git merge oder als Pull Request wieder zusammenführen. Ändern sich in zwei Branches dieselben Zeilen derselben Datei unterschiedlich, entsteht ein Merge-Konflikt, den Git nicht automatisch auflösen kann.

Verteilt statt zentralisiert

Ältere Versionskontrollsysteme wie SVN oder CVS waren zentralisiert: Nur der zentrale Server hatte die volle Historie, lokale Kopien enthielten nur den aktuellen Stand. Bei Git enthält JEDE lokale Kopie die komplette Historie des Projekts. Das hat zwei wichtige Konsequenzen: Erstens funktionieren fast alle Git-Operationen (Commit, Branch-Wechsel, komplette Log-Historie durchsuchen, alte Versionen vergleichen) komplett offline — nur push/pull/fetch brauchen eine Verbindung zum Remote. Zweitens ist das System robust gegen Serverausfälle: Geht das zentrale Repository verloren, hat trotzdem jeder Mitarbeiter mit einem geklonten Repository eine vollständige, wiederherstellbare Kopie der gesamten Historie.

Git ist nicht GitHub

Ein häufiges Missverständnis bei Einsteigern: GitHub und GitLab sind Hosting-Plattformen FÜR Git-Repositories (mit Zusatzfunktionen wie Pull Requests, Issue-Tracking, CI/CD), aber nicht Git selbst — Git funktioniert vollständig auch ohne jede dieser Plattformen, rein lokal oder mit einem selbst gehosteten Server.

Siehe auch: GitHub, GitLab, Merge-Konflikte, Conventional Commits