Git Grundlagen
Warum Git? 1​
Die Entwicklung von Git ist eine Erfolgsgeschichte. Als 👉 Linus Torvalds 2005 die Entwicklung von Git initiierte lag dem ein ganz pragmatisches Problem zugrunde: Als Verwalter der Entwicklung des 👉 Linux-Kernels benötigte er ein mächtiges, verteiltes und kollaboratives Werkzeug zur Versionsverwaltung von Quellcode. Das zuvor verwendete proprietäre Tool bot keine Möglichkeit der kostenlosen Verwendung und die kostenfreien Alternativen genügten den Anforderungen von Torvalds nicht. Die Idee ein eigenes, freies Softwareprodukt zu schreiben war geboren. Seitdem wurde Git von Jahr zu Jahr populärer und hat eine ganze Reihe auf Git aufsetzender Anwendungen (etwa Sourcetree und GitHub Desktop) und Webplattformen (etwa GitHub und Bitbucket) hervorgebracht. Doch warum wird Git so vielfach verwendet?
-
Paralleles Arbeiten: Git erlaubt es mehreren Entwicklern parallel und dezentral an einem Projekt (repository) in verschiedenen Entwicklungszweigen (branches) zu arbeiten. Der eigentliche Clou liegt dabei darin, dass Git eine ganze Reihe an Möglichkeiten (merge, rebasing, cherry picking, etc.) bietet diese Entwicklungszweige auch wieder zusammenzuführen.
-
Flexibilität: Es ist möglich verschiedenste Arbeitsweisen und Arbeitsmodelle (workflows) in Git zu realisieren. So eignet sich Git für die lokale Verwendung bei einem einzelnen Entwickler bis zur servergestützten Teamarbeit in einem internationalen Softwarekonzern. In gewisser Art und Weise baut man sich auf der Basis von Git seine eigene Versionsverwaltung auf.
-
Einfache Beiträge: Git macht es vergleichsweise einfach zu einem Projekt beizutragen bei dem man weder der Besitzer noch Teil des Kernteams ist. Bei zentralen Versionsverwaltungssystemen steht hier oft die Rechteverwaltung im Weg, doch erlaubt Git das einfache Kopieren (clone) des Quellcodes von einem gefolgten Änderungsvorschlag (pull request).
-
Performance: Selbst bei sehr großen Projekten bleibt Git schnell. Auf meinem MacBook Air (11 Zoll, 2016) konnte ich von einer aktuellen Version des Quellcodes des Linux-Kernels auf eine sechs Jahre alte Version von 2010 unter einer Minute wechseln. Das mag zunächst gar nicht so beeindruckend klingen, doch man sollte bedenken das hier etwa 40.000 Dateiänderungen vorlagen!
-
Robustheit: Aufgrund der Architektur von Git ist ein gravierender Datenverlust sehr unwahrscheinlich. Prüfsummen verhindern eine unbeabsichtigte Korruption von Daten, der dezentrale Aufbau sorgt dafür, dass der Code auf mehreren Rechnern vorliegt und die einfache Datenstruktur sorgt für die Interpretierbarkeit der Daten. Schlussendlich erlaubt die Versionierung und Verzweigung des Quellcodes wieder zu einem funktionierenden Stand zurückzukehren.
-
Offsite und Offline: Die dezentrale und zugleich verknüpfbare Struktur von Git erlaubt sowohl die Arbeit mit verteilten Entwicklungsteams als auch – zumindest eine gewisse Zeit lang – die Arbeit ohne Zugriff auf den Server.
-
Erweiterbarkeit und Integrationsfähigkeit: Git ist nahezu beliebig erweiterbar und integrierbar. Es ist offen für individuelle Anwendungen und Zusammenarbeit mit nahezu jeder belieben anderen Software.
-
Gemeinschaft und Freiheit: Git ist nicht nur kostenlose, sondern auch 👉 freie Software. Das heisst der Quellcode steht offen bereit und Mitarbeit ist sogar erwünscht. Verletzungen des Urheberrechts oder rechtliche Konflikte sind ausgeschlossen. Darüber hinaus existiert ein nahezu riesiges Ökosystem aus Dokumentationen und Erklärungen, Tools, Plattformen, Dienstleistern sowie Plug-Ins. Hinsichtlich des gemeinschaftlichen Aspekts sei GitHub hervorgehoben, welches sich in den letzten Jahren zum Quasi-Standard von OpenSource-Projekten entwickelt hat. Hier findet man abertausende Entwickler und deren Softwareprojekte.
Konzepte​
Das Kernelement von Git sind die Repositories (Repo - ein ganz normaler Ordner, dessen Dokumente mit Git versioniert werden). Dabei wird zwischen dem remote Repo auf dem Server und den lokalen Repo auf einem Computer unterschieden.
Um mit Git verwalteten Projekten zu arbeiten, muss das Repository heruntergeladen werden. Man spricht von Klonen (clone), weil
- sich Git die Internet-Adresse des Remote Repos merkt und man somit zu einem späteren Zeitpunkt Änderungen (manuell) synchronisieren kann
- auch alle Vorgängerversionen der Projektdateien enthalten sind
Dateien in diesem Ordner sind versioniert - dies bedeutet für Git, dass zu einem gewissen Zeitpunkt Änderungen vorgenommen wurden. Jede Änderung ist mit einer von der Programmierer:in geschriebenen Nachricht versehen.
- Commit
- Versionen werden in Git als Commits bezeichnet. Ein Commit ist ein Paket von Änderungen, die zu einem bestimmten Zeitpunkt gemacht wurden.
- Nachricht
- Jeder Commit wird mit einer Nachricht (Message) versehen. So kann nachvollzogen werden, was in welchem Schritt dazugekommen ist.
- Hashwert
- Jeder Commit wird eindeutig über einen Hashwert identifiziert. Dieser Hashwert ist eine Art Fingerabdruck einer Änderung, wobei alle relevanten Informationen (inkl. Autor, Zeit, Hashwert des vorherigen Commits, Hashwert des aktuellen Repository-Inhalts, Commit-Nachricht) enthalten sind.
Nach dem Klonen des Projektes können mit einem pull alle Änderungen vom remote Repository ins lokale Repository synchronisiert werden. Dadurch wird sichergestellt, dass keine Änderungen von anderen Projektmitarbeitenden verpasst werden.
Änderungen vornehmen​
Jetzt kann die Datei bearbeitet werden. Git kann nun anzeigen, welche Zeilen und Zeichen lokal verändert wurden. Dadurch können Änderungen nochmals überprüft werden.
Änderungen | |||||
1 | - | def aaa(a, b): | 1 | + | def durchschnitt(a, b): |
2 |     return (a + b) / 2 | 2 |     return (a + b) / 2 | ||
3 | 3 | ||||
4 | - | print(f'Ø:{aaa(3, 5)}') | 4 | + | print(f'Ø: {durchschnitt(3, 5)}') |
Ist man mit der Änderung zufrieden, fügt man alle veränderten Dateien einem Änderungspaket hinzu. Dieses Änderungspaket wird in Git als Stage bezeichnet. Mit dem Commit Befehl wird das Änderungspaket finalisiert und mit einem Zeitstempel und einer Nachricht versehen. Die Nachricht beschreibt, was in dieser Änderung gemacht wurde.
Im obigen Beispiel könnte die Nachricht etwa lauten:
Verwende einen sinnvollen Funktionsnamen
Mit dem push Befehl wird anschliessend dieses Änderungspaket an das Remote-Repository geschickt.
Die wichtigste Eigenschaft von Git ist, dass es Änderungen, welche von verschiedenen Personen vorgenommen wurden, zusammenführen kann. Dadurch kann man Änderungen von verschiedenen Personen in einem Repository kombinieren, ohne dass man permanent online ist. Der Vorgang des Zusammenführens wird in Git merge genannt.
Visual Studio Code verfügt über eine eingebaute Schnittstelle zu Git. Diese werden wir im Normalfall brauchen. Manchmal ist es aber nötig direkt mit Git zu arbeiten. Dazu dient die App Git Bash auf Windows. Auf dem Mac kann man dazu direkt das Terminal brauchen. Die nötigen Kommandos werden wir nach und nach kennenlernen (halten Sie diese am besten in Ihrer Dokumentation fest).