🏠 Zurück zur Startseite
🌳

Vorlesung 4

Git - Versionskontrolle für Programmierer

Grundlagen der Programmierung in C

Prof. Dr. Alexandra Mikityuk

HTW Berlin - Wintersemester 2025/26

In dieser Vorlesung lernen Sie:
✅ Was Git ist und warum es jeder Programmierer nutzt
✅ Ihre erste Zeitmaschine für Code erstellen
✅ Mit Branches arbeiten und Änderungen verwalten
✅ Mit GitHub zusammenarbeiten

😱 Das Leben ohne Git: Ein Horror-Szenario

📖 Die Geschichte von Max

Max ist Programmierer. Er hat gerade sein Projekt fertiggestellt:
projekt.c

Dann kommt eine neue Anforderung. Max ist vorsichtig:
projekt_neu.c

Nach einer Woche sieht sein Ordner so aus:
projekt.c
projekt_neu.c
projekt_neu_2.c
projekt_final.c
projekt_final_wirklich.c
projekt_final_wirklich_diesmal.c
projekt_DIESER_HIER.c 😭

⚠️ Problem: Welche Version ist die Richtige? Was wurde geändert? Kann man zurückgehen?

🎯 Was ist Git?

Git ist eine Zeitmaschine für Code! ⏰

Git ist ein Versionskontrollsystem, das:

  • 📸 Snapshots von Ihrem Code macht
  • 🔙 Ihnen erlaubt, zu früheren Versionen zurückzukehren
  • 📝 Jeden Änderung mit Nachricht dokumentiert
  • 🌿 Verschiedene Versionen parallel entwickeln lässt
  • 👥 Teamarbeit ermöglicht, ohne Chaos

💡 Fun Fact: Git wurde 2005 von Linus Torvalds entwickelt (ja, der Linux-Erfinder!). Er brauchte ein Tool, um mit Tausenden von Entwicklern weltweit am Linux-Kernel zu arbeiten.

Git ≠ GitHub

🌳 Git

  • Das Tool selbst
  • Läuft auf Ihrem Computer
  • Verwaltet Versionen lokal
  • Funktioniert offline
  • Kostenlos und Open Source

☁️ GitHub

  • Eine Website/Platform
  • Läuft in der Cloud
  • Speichert Code online
  • Ermöglicht Zusammenarbeit
  • Hat zusätzliche Features (Issues, Pull Requests)

Analogie: Git ist wie Microsoft Word (das Programm). GitHub ist wie OneDrive oder Dropbox (wo Sie Ihre Dokumente online speichern und teilen).

💻 Terminal/Eingabeaufforderung öffnen

Bevor wir Git nutzen können, müssen wir wissen, wie man das Terminal (oder die Eingabeaufforderung) öffnet:

🪟 Windows:

  • Eingabeaufforderung: Windows-Taste + Rcmd eingeben → Enter
  • PowerShell: Rechtsklick auf Start-Button → "Windows PowerShell"
  • Git Bash: Nach Git-Installation: Rechtsklick im Ordner → "Git Bash here"

🍎 macOS:

  • Spotlight: Cmd + Leertaste → "Terminal" eingeben → Enter
  • Finder: Programme → Dienstprogramme → Terminal
  • Launchpad: Nach "Terminal" suchen

🐧 Linux:

  • Tastenkombination: Ctrl + Alt + T
  • Application Menu: Suchen Sie nach "Terminal" oder "Konsole"
  • Rechtsklick: Im Dateimanager → "Terminal hier öffnen"

💡 Tipp: Das Terminal ist Ihr Werkzeug für Git! Keine Angst - wir lernen alle Befehle Schritt für Schritt.

🔧 Git installieren

Installation je nach Betriebssystem:

🪟 Windows:

Download von git-scm.com

# Nach Installation testen: git --version

🍎 Mac:

# Mit Homebrew: brew install git # Oder Xcode Command Line Tools (enthält Git): xcode-select --install

🐧 Linux:

# Ubuntu/Debian: sudo apt-get install git # Fedora: sudo dnf install git

⚙️ Git konfigurieren

Bevor Sie Git nutzen, müssen Sie sich vorstellen:

# Ihren Namen setzen git config --global user.name "Max Mustermann" # Ihre E-Mail setzen git config --global user.email "max@example.com" # Konfiguration überprüfen git config --list # Oder alle Einstellungen in einem Editor öffnen git config --global --edit

💡 Warum? Git speichert bei jedem "Snapshot" (Commit), wer die Änderung gemacht hat. Das ist besonders wichtig bei Teamarbeit!

⚠️ Tipp: Verwenden Sie die gleiche E-Mail wie bei GitHub, dann werden Ihre Commits korrekt Ihrem Profil zugeordnet!

📝 Standard-Editor für Git einrichten

Git öffnet manchmal einen Text-Editor für Commit-Messages oder Konfiguration. Sie können Ihren bevorzugten Editor festlegen:

🪟 Windows:

# Notepad (einfach) git config --global core.editor notepad # Visual Studio Code git config --global core.editor "code --wait" # Notepad++ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar"

🍎 macOS:

# Visual Studio Code git config --global core.editor "code --wait" # TextEdit (Standard) git config --global core.editor "open -e -W" # Nano (im Terminal) git config --global core.editor nano

🐧 Linux:

# Visual Studio Code git config --global core.editor "code --wait" # Nano (einfach) git config --global core.editor nano # Vim (fortgeschritten) git config --global core.editor vim

💡 Tipp für Anfänger: Verwenden Sie Notepad (Windows), TextEdit (Mac) oder Nano (Linux) - diese sind am einfachsten zu bedienen!

🎬 Ihr erstes Git-Repository

Ein Repository (kurz: Repo) ist ein Ordner, den Git überwacht.

Schritt 1: Ordner erstellen und öffnen

mkdir mein-projekt cd mein-projekt

Schritt 2: Git initialisieren

git init # Ausgabe: Initialized empty Git repository in /pfad/zu/mein-projekt/.git/

Was passiert?

Git erstellt einen versteckten Ordner .git/, wo alle Versionen gespeichert werden.

🎉 Gratulation! Sie haben gerade Ihre erste Zeitmaschine erstellt!

📦 Die drei Bereiche in Git

1. Working Directory 📁
Ihr normaler Ordner, wo Sie Dateien bearbeiten
2. Staging Area 📋
Vorbereitungsbereich für den nächsten Snapshot
3. Repository 💾
Gespeicherte Snapshots (Commits) in .git/

📸 Ihr erster Commit (Snapshot)

Schritt für Schritt:

1. Datei erstellen:

echo Hallo Git! > readme.txt

2. Status prüfen:

git status # Zeigt: Untracked files: readme.txt (rot)

3. Zur Staging Area hinzufügen:

git add readme.txt # Jetzt ist readme.txt bereit für den Commit (grün)

4. Commit erstellen:

git commit -m "Erste Version: Readme hinzugefügt" # -m steht für "message" (Nachricht)

🔍 Git Status verstehen

git status ist Ihr bester Freund!

git status On branch main Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: readme.txt Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes) modified: main.c Untracked files: (use "git add <file>..." to include in what will be committed) test.c

💡 Farben:
Grün = In Staging Area (bereit für Commit)
Rot = Geändert, aber nicht in Staging
Grau/Weiß = Neue, ungetrackte Dateien

📚 Die Geschichte ansehen mit git log

Mit git log sehen Sie alle Commits:

git log commit 2f8d7a9b... (HEAD -> main) Author: Max Mustermann <max@example.com> Date: Mon Jan 15 14:23:00 2024 +0100 Berechnungsfunktion hinzugefügt commit 5a3c1e4d... Author: Max Mustermann <max@example.com> Date: Mon Jan 15 13:10:00 2024 +0100 Erste Version: Readme hinzugefügt

Schönere Ausgabe:

git log --oneline 2f8d7a9 Berechnungsfunktion hinzugefügt 5a3c1e4 Erste Version: Readme hinzugefügt

🌳 Branches visualisieren mit --graph

Mit --graph sehen Sie die Branch-Struktur visuell:

Ohne --graph:

git log --oneline 7a3f2c1 Merge branch 'feature' 4d8e9a2 Add new feature 2f8d7a9 Fix bug in main 5a3c1e4 Initial commit

Mit --graph:

git log --oneline --graph * 7a3f2c1 Merge branch 'feature' |\ | * 4d8e9a2 Add new feature * | 2f8d7a9 Fix bug in main |/ * 5a3c1e4 Initial commit

Was bedeutet das?

*   = Ein Commit
|   = Linie zeigt Verlauf
|\  = Branch teilt sich (Branch wurde erstellt)
|/  = Branches vereinen sich (Merge)

Der Graph zeigt, dass ein Feature-Branch erstellt wurde, parallel zu main entwickelt wurde, und dann wieder zusammengeführt wurde!

😄 Wahre Geschichte: Die Commit-Message

📖 3 Uhr morgens...

Ein Entwickler arbeitete bis spät in die Nacht. Seine Commit-Messages wurden... kreativ:

# 14:00 Uhr git commit -m "Neue Funktion hinzugefügt" # 18:00 Uhr git commit -m "Bug fix" # 22:00 Uhr git commit -m "Warum funktioniert das nicht??" # 01:00 Uhr git commit -m "FINALLY WORKS!!!" # 03:00 Uhr git commit -m "I give up" # 03:30 Uhr git commit -m "jk it works now. going to bed"

⚠️ Lektion: Schreiben Sie aussagekräftige Commit-Messages! Ihr zukünftiges Ich (und Ihre Kollegen) werden es Ihnen danken!

✍️ Gute Commit-Messages schreiben

❌ Schlecht:

"fix" "update" "asdf" "stuff" "Final version" "This should work" "???"

✅ Gut:

"Fix division by zero bug" "Add user login function" "Update readme with examples" "Remove unused variables" "Refactor calculation logic" "Fix typo in error message"

📝 Goldene Regeln:

  • Kurz und präzise (50 Zeichen oder weniger)
  • Im Imperativ ("Add" statt "Added")
  • Beschreibe WAS und WARUM (nicht WIE)
  • Auf Englisch in professionellen Projekten

💡 Warum Imperativ?

Denken Sie: "If applied, this commit will..." (Wenn angewendet, wird dieser Commit...)

✅ "If applied, this commit will Add user login function"
✅ "If applied, this commit will Fix memory leak"
✅ "If applied, this commit will Update documentation"

❌ "If applied, this commit will Added user login function" ← Klingt falsch!
❌ "If applied, this commit will Fixed memory leak" ← Klingt falsch!

🌿 Branches - Parallele Universen

Ein Branch ist eine separate Entwicklungslinie.

        C3 ← neue-funktion (Branch)
       /
C1C2 ← main (Standard-Branch)

Warum Branches?

  • ✅ Neue Features entwickeln, ohne Hauptcode zu beeinflussen
  • ✅ Experimente durchführen
  • ✅ Bugfixes isoliert erstellen
  • ✅ Zusammenarbeit: Jeder hat seinen eigenen Branch

🔀 Mit Branches arbeiten

Branch erstellen:

# Neuen Branch erstellen git branch neue-funktion # Zu diesem Branch wechseln git checkout neue-funktion # Beides in einem Befehl: git checkout -b neue-funktion

Branches anzeigen:

git branch main * neue-funktion # * zeigt aktuellen Branch

Branch wechseln:

git checkout main # Oder mit neuerer Syntax: git switch main

🔗 Branches zusammenführen (Merge)

Wenn Ihr Feature fertig ist, können Sie es in main einbringen:

# 1. Zurück zu main wechseln git checkout main # 2. Branch mergen git merge neue-funktion # Ausgabe: Updating 5a3c1e4..2f8d7a9 Fast-forward funktion.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
Vorher:
        C3 ← neue-funktion
       /
C1C2 ← main

Nachher (nach Merge):
C1C2C3 ← main, neue-funktion

Branch löschen (optional):

git branch -d neue-funktion

💥 Merge Conflicts - Wenn Git verwirrt ist

Ein Merge Conflict entsteht, wenn dieselbe Zeile in beiden Branches unterschiedlich geändert wurde.

Beispiel:

# main.c in Branch "main": printf("Hallo Welt!"); # main.c in Branch "feature": printf("Hello World!");

Bei Merge zeigt Git:

<<<<<<< HEAD (main) printf("Hallo Welt!"); ======= printf("Hello World!"); >>>>>>> feature

Lösung: Sie entscheiden, was bleibt - in 3 Schritten:

⚠️ Wichtig: Bevor Sie zu Git committen, müssen Sie zuerst die Datei lokal bearbeiten!

# Schritt 1: Öffnen Sie main.c in einem Editor # und entfernen Sie die Konfliktmarkierungen # Entscheiden Sie: Behalten Sie "Hallo Welt!" ODER "Hello World!" # Speichern Sie die Datei! # Schritt 2: Nachdem Sie die Datei lokal gespeichert haben: git add main.c # Schritt 3: Jetzt erst zu Git committen: git commit -m "Merge conflict resolved"

☁️ GitHub - Code in der Cloud

Repository auf GitHub erstellen:

  1. Gehen Sie zu github.com
  2. Klicken Sie auf "New repository"
  3. Geben Sie einen Namen ein (z.B. "mein-projekt")
  4. Klicken Sie "Create repository"

Lokales Repo mit GitHub verbinden:

# Remote hinzufügen git remote add origin https://github.com/username/mein-projekt.git # Zum ersten Mal hochladen git push -u origin main # Danach einfach: git push

🔄 Clone, Pull, Push - Die drei Freunde

1. Clone - Projekt herunterladen

git clone https://github.com/username/projekt.git # Kopiert das komplette Repo auf Ihren Computer

2. Pull - Änderungen herunterladen

git pull # Holt neue Commits von GitHub

3. Push - Änderungen hochladen

git add . git commit -m "Neue Funktion" git push # Sendet Ihre Commits zu GitHub

💡 Workflow: Pull → Änderungen machen → Add → Commit → Push

👥 Teamwork mit Git - Eine Geschichte

📖 Anna und Bob programmieren zusammen

Montag, 9:00 Uhr - Anna:

git clone https://github.com/team/projekt.git git checkout -b feature-login # Anna arbeitet an Login-Funktion... git commit -m "Add login function" git push origin feature-login

Montag, 10:00 Uhr - Bob:

git clone https://github.com/team/projekt.git git checkout -b feature-dashboard # Bob arbeitet am Dashboard... git commit -m "Add dashboard layout" git push origin feature-dashboard

Dienstag - Anna merged zuerst:

# Anna erstellt Pull Request auf GitHub → Merged!

Dienstag - Bob holt Updates:

git checkout main git pull # Bekommt Annas Login-Funktion! git checkout feature-dashboard git merge main # Integriert Annas Code

🙈 .gitignore - Dateien ausschließen

Manche Dateien sollten nicht in Git gespeichert werden:

  • 🔒 Passwörter und API-Keys
  • 📦 Kompilierte Dateien (.o, .exe)
  • 📁 System-Dateien (.DS_Store, Thumbs.db)
  • 📚 Dependencies (node_modules/, __pycache__/)

Erstellen Sie eine .gitignore Datei:

# .gitignore # Kompilierte Dateien *.o *.exe a.out # Editor-Dateien *.swp .vscode/ # System-Dateien .DS_Store Thumbs.db # Geheimnisse .env secrets.txt

🛠️ Wichtige Git-Befehle - Cheat Sheet

Befehl Beschreibung
📚 Grundlagen
git init Neues Repository erstellen
git status Status des Repositories anzeigen
git add <datei> Datei zur Staging Area hinzufügen
git add . Alle Änderungen zur Staging Area
git commit -m "..." Commit mit Nachricht erstellen
git log Commit-Historie anzeigen
🌿 Branches
git branch Alle Branches anzeigen
git branch <name> Neuen Branch erstellen
git checkout <branch> Zu einem Branch wechseln
git checkout -b <name> Branch erstellen und direkt wechseln
git merge <branch> Branch zusammenführen
☁️ Remote (GitHub)
git clone <url> Repository von GitHub klonen
git pull Updates von Remote holen
git push Commits zu Remote hochladen
🔧 Nützliches
git diff Änderungen anzeigen
git log --oneline --graph Schöne Historie mit Branches

💻 Praktische Übung

Aufgabe: Ihr erstes Git-Projekt!

  1. Erstellen Sie einen Ordner git-uebung
  2. Initialisieren Sie Git: git init
  3. Erstellen Sie eine Datei rechner.c mit einer einfachen Addition
  4. Fügen Sie die Datei hinzu und committen Sie: git add rechner.cgit commit
  5. Erstellen Sie einen Branch feature-multiplikation
  6. Fügen Sie eine Multiplikationsfunktion hinzu
  7. Committen Sie die Änderung
  8. Wechseln Sie zurück zu main und mergen Sie
  9. Schauen Sie sich die Historie an mit git log --oneline --graph

🎯 Bonus: Erstellen Sie ein GitHub-Repository und pushen Sie Ihr Projekt!

🔍 Änderungen anzeigen mit git diff

Mit git diff können Sie sehen, was sich geändert hat:

1. Änderungen vor dem Staging sehen:

git diff # Zeigt alle Änderungen, die noch nicht mit "git add" hinzugefügt wurden

2. Änderungen in der Staging Area sehen:

git diff --staged # Zeigt Änderungen, die mit "git add" gestaged wurden

3. Änderungen zwischen zwei Commits vergleichen:

git diff abc123..def456 # Vergleicht zwei Commits (Commit-IDs von git log)

4. Änderungen in einer bestimmten Datei:

git diff main.c # Zeigt nur Änderungen in main.c

💡 Tipp: Verwenden Sie git diff vor jedem Commit, um zu prüfen, was Sie committen!

⚠️ Häufige Anfängerfehler

1. Vergessen zu committen

Sie machen viele Änderungen, aber vergessen git commit. Machen Sie kleine, häufige Commits!

2. Direkt in main arbeiten

Nutzen Sie Branches für neue Features! main sollte immer funktionieren.

3. Schlechte Commit-Messages

"update" oder "fix" sagt nichts aus. Beschreiben Sie, WAS Sie geändert haben!

4. Sensible Daten committen

Passwörter, API-Keys etc. gehören NICHT in Git! Nutzen Sie .gitignore!

5. Vor Push nicht pullen

Immer erst git pull, dann arbeiten, dann push!

💡 Pro-Tipps für Git im Alltag

✅ Commit oft!

Lieber viele kleine Commits als ein riesiger. Jeder Commit = ein logischer Schritt.

✅ Branch-Namen beschreibend

Nicht "test" oder "neu", sondern "feature-login" oder "bugfix-memory-leak"

✅ Vor dem Feierabend pushen

Damit ist Ihre Arbeit gesichert, falls Ihr Laptop kaputt geht!

✅ README.md pflegen

Dokumentieren Sie, was Ihr Projekt macht. Ihr zukünftiges Ich dankt!

✅ Mit .gitignore starten

Erste Datei in jedem Projekt sollte .gitignore sein!

📚 Zusammenfassung

Was haben wir gelernt?

🎯 Grundkonzepte

  • Repository (Repo)
  • Commit (Snapshot)
  • Branch (Entwicklungslinie)
  • Merge (Zusammenführen)
  • Remote (GitHub)

🛠️ Wichtige Befehle

  • git init, status, add
  • git commit, log
  • git branch, checkout, merge
  • git clone, pull, push
  • .gitignore

🎯 Nächste Schritte:

Üben, üben, üben! Erstellen Sie ein GitHub-Profil und starten Sie Ihr erstes Projekt. Git wird durch Verwendung zur Gewohnheit!

📖 Weiterführende Ressourcen

Online Lernen:

Tools:

  • 💻 GitHub Desktop: GUI für Git (für Anfänger)
  • 🌳 GitKraken: Schöne visuelle Darstellung
  • 📝 VS Code: Eingebaute Git-Integration

Vielen Dank!

Fragen?

Prof. Dr. Alexandra Mikityuk

📧 HTW Berlin

🏢 Raum 308

📞 +49 30 5019-2664

🎯 Hausaufgabe

1. Installieren Sie Git
2. Erstellen Sie ein GitHub-Konto
3. Machen Sie die Übung von Slide 23
4. Pushen Sie Ihr erstes Projekt zu GitHub!

🌳 Happy Coding! 🚀
1 / 28