📝 Modul 2: Versionskontrolle mit Git
⏱️ Dauer: ca. 90 Minuten
Lernziele: Sie verstehen die Git-Architektur (Working Directory, Staging, Repository), können mit Branches arbeiten, Merge-Konflikte lösen, die Git-History analysieren und kennen bewährte Branching-Strategien für Netzwerkumgebungen.
📚 Inhalt dieses Moduls
- 1. Was ist Git?
- 2. Die drei Zonen von Git
- 3. Git-Grundbefehle
- 4. Branching-Strategien
- 5. Merge-Konflikte verstehen
- 6. Git History & Logs
- 7. Praxis-Übungen (6 Stück)
- 8. Cheat Sheet & Troubleshooting
1. Was ist Git?
Stellen Sie sich Git vor wie Speicherpunkte in einem Videospiel. Sie können jederzeit speichern, und wenn etwas schiefgeht, laden Sie einfach einen früheren Spielstand. Nur viel besser: Git speichert ALLE Spielstände, nicht nur den letzten.
Warum Git für Netzwerkkonfigurationen?
In der klassischen Netzwerkwelt kennt jeder das Problem: "Wer hat denn gestern Nacht den Switch-Port geändert?" Mit Git gehört das der Vergangenheit an.
- Vollständige History: Wer hat wann welche Änderung gemacht – und warum?
- Rollback in Sekunden: Letzte Änderung war Mist? Ein Befehl, alles wieder gut.
- Paralleles Arbeiten: Drei Leute, drei Features, null Konflikte
- Automatisches Backup: Ihr Code ist sicher auf einem Server (GitLab, GitHub)
- Code Review: Vier-Augen-Prinzip vor der Produktion
- Audit-Trail: Für Compliance unverzichtbar
- switch-config_v2_final_FINAL.txt
- switch-config_backup_jan_neu.txt
- "Wer hat das geändert?!"
- Rollback = Panik
- Eine Datei, vollständige History
- Jede Änderung dokumentiert
- git blame → sofort sichtbar
- git revert → 5 Sekunden
2. Die drei Zonen von Git verstehen
Bevor wir mit den Befehlen loslegen, müssen Sie verstehen, wie Git intern funktioniert. Stellen Sie sich Git wie eine Baustelle mit drei Bereichen vor:
┌─────────────────────────────────────────────────────────────────────────┐ │ GIT - Die drei Zonen │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ git add ┌─────────────────┐ git commit │ │ │ │ ─────────────> │ │ ─────────────> │ │ │ WORKING │ │ STAGING │ │ │ │ DIRECTORY │ │ AREA │ │ │ │ │ <───────────── │ (Index) │ │ │ │ 📁 Ihre Dateien│ git restore │ 📋 Vorbereit. │ │ │ └─────────────────┘ └─────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ▼ │ │ │ ┌─────────────────┐ │ │ │ │ │ │ │ │ │ REPOSITORY │ │ │ │ <───────────────────────│ (.git) │ │ │ │ git checkout │ │ │ │ │ 💾 Geschichte │ │ │ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘
Working Directory
Die Baustelle: Hier arbeiten Sie! Alle Dateien, die Sie sehen und bearbeiten können. Änderungen hier sind noch nicht gesichert.
Analogie: Der Schreibtisch, auf dem Sie gerade arbeiten.
Staging Area (Index)
Der Warenkorb: Hier sammeln Sie Änderungen, die zusammen committet werden sollen. Wie ein Einkaufswagen vor der Kasse.
Analogie: Das Tablett vor dem Fotografieren – Sie arrangieren erst, dann knipsen.
Repository (.git)
Das Archiv: Alle Commits, die gesamte Geschichte. Hier ist alles sicher gespeichert – für immer.
Analogie: Das Videospiel-Archiv mit allen Speicherständen.
Sie bearbeiten Dateien im Working Directory, stagen sie für den nächsten Commit, und committen sie ins Repository. Erst dann ist die Änderung wirklich gespeichert!
Beispiel: Eine Änderung durch alle Zonen
# 1️⃣ Sie bearbeiten eine Datei (Working Directory)
nano switch-config.yaml
# 2️⃣ Status zeigt: Datei wurde geändert (rot = nicht gestaged)
git status
# modified: switch-config.yaml (rot)
# 3️⃣ Datei in die Staging Area verschieben
git add switch-config.yaml
# 4️⃣ Status zeigt: Datei ist zum Commit bereit (grün = gestaged)
git status
# modified: switch-config.yaml (grün)
# 5️⃣ Commit erstellen (ab ins Repository!)
git commit -m "VLAN 100 auf Switch konfiguriert"
# 6️⃣ Status zeigt: Alles sauber
git status
# nothing to commit, working tree clean3. Die wichtigsten Git-Befehle
3.1 Repository erstellen oder klonen
Zwei Wege zum Repository:
# Option A: Bestehendes Repository klonen
git clone https://gitlab.local/netzwerk/fabric-config.git
cd fabric-config
# Option B: Neues Repository erstellen
mkdir mein-projekt
cd mein-projekt
git init3.2 Änderungen verfolgen und committen
Der tägliche Workflow:
# Status anzeigen - was hat sich geändert?
git status
# Alle Änderungen zum Commit vormerken (stagen)
git add .
# Oder nur bestimmte Dateien
git add fabric.yaml
git add configs/spine-1.yaml
# Oder mit Wildcards
git add *.yaml
# Änderungen aus der Staging Area entfernen (ohne Datei zu löschen!)
git restore --staged fabric.yaml
# Commit erstellen mit aussagekräftiger Message
git commit -m "VLAN 100 hinzugefügt für Produktion"
# Änderungen zum Server hochladen
git pushDie Commit-Message sollte erklären, was und warum geändert wurde:
- "Update"
- "Fix"
- "Änderungen"
- "asdf"
- "VLAN 100 für Produktions-Server hinzugefügt"
- "BGP-Peer zu ISP2 konfiguriert (AS65002)"
- "MTU auf 9000 für Jumbo Frames angepasst"
- "Tippfehler in Spine-1 Hostname behoben"
3.3 Änderungen vom Server holen
# Neueste Änderungen vom Server holen und integrieren
git pull
# Nur Informationen holen (ohne zu mergen)
git fetch
# Was hat sich auf dem Server geändert?
git log origin/main --oneline -5Bevor Sie git push machen, immer erst git pull! Sonst riskieren Sie Konflikte, wenn jemand anders in der Zwischenzeit Änderungen gepusht hat.
4. Branching-Strategien verstehen
Branches sind wie Baustellen auf der Autobahn: Der Verkehr (Produktion) läuft weiter, während Sie in Ruhe an der Seite umbauen. Erst wenn die Baustelle fertig ist, wird die neue Spur freigegeben.
4.1 Branches erstellen und wechseln
# Alle Branches anzeigen
git branch
# Neuen Branch erstellen
git branch feature/vlan-200
# Zu einem Branch wechseln
git checkout feature/vlan-200
# ODER: Erstellen und direkt wechseln (empfohlen!)
git checkout -b feature/vlan-200
# Neuere Alternative (ab Git 2.23):
git switch -c feature/vlan-200
# Zurück zum main Branch
git checkout main
# Branch löschen (nachdem er gemerged wurde)
git branch -d feature/vlan-200
# Branch forciert löschen (auch ohne Merge)
git branch -D feature/vlan-2004.2 Branching-Strategie: GitFlow vs. Trunk-Based
Für Netzwerkteams gibt es zwei gängige Strategien. Die Wahl hängt von Ihrer Team-Größe und Änderungsfrequenz ab:
🌳 GitFlow
Mehrere langlebige Branches für verschiedene Umgebungen.
- Klare Trennung: Dev/Test/Prod
- Gut für Release-Zyklen
- Einfaches Rollback
- Komplex bei vielen Branches
- Lange Lebenszeiten = Merge-Hölle
🎯 Trunk-Based Development
Ein Hauptbranch, kurzlebige Feature-Branches.
- Einfach und schnell
- Weniger Merge-Konflikte
- Ideal für CI/CD
- Erfordert gute Tests
- Feature Flags manchmal nötig
Für die meisten Netzwerkteams empfehlen wir Trunk-Based Development:
- Feature-Branch erstellen (max. 1-2 Tage Lebenszeit)
- Kleine, fokussierte Änderungen
- Schneller Merge Request + Review
- CI/CD-Pipeline validiert automatisch
GitFlow macht nur Sinn, wenn Sie strikte Release-Zyklen haben (z.B. monatliche Rollouts).
4.3 Branch-Namenskonventionen
Einheitliche Namen erleichtern die Zusammenarbeit:
5. Merge-Konflikte verstehen und lösen
Ein Merge-Konflikt passiert, wenn zwei Leute die gleiche Zeile in der gleichen Datei geändert haben. Git kann nicht automatisch entscheiden, welche Version richtig ist – Sie müssen helfen.
5.1 Wie ein Konflikt entsteht
Situation:
Alice (main): Bob (feature/vlan):
───────────── ───────────────────
vlan_id: 100 vlan_id: 200 ← Gleiche Zeile!
name: Prod name: Dev
Beim Merge: 💥 KONFLIKT!
Git weiß nicht: 100 oder 200?5.2 Konflikt erkennen
# Merge versuchen
git merge feature/vlan-200
# Ausgabe bei Konflikt:
# Auto-merging fabric.yaml
# CONFLICT (content): Merge conflict in fabric.yaml
# Automatic merge failed; fix conflicts and then commit the result.
# Status zeigt:
git status
# both modified: fabric.yaml5.3 Konflikt in der Datei
So sieht ein Konflikt in der Datei aus:
vlans:
<<<<<<< HEAD
- id: 100
name: Produktion
=======
- id: 200
name: Entwicklung
>>>>>>> feature/vlan-200Die Konflikt-Marker erklärt:
<<<<<<< HEAD– Beginn Ihrer aktuellen Version (main)=======– Trennlinie zwischen den Versionen>>>>>>> feature/vlan-200– Ende der anderen Version
5.4 Konflikt lösen
Sie haben drei Optionen:
# Option 1: NUR Ihre Version behalten
vlans:
- id: 100
name: Produktion
# Option 2: NUR die andere Version behalten
vlans:
- id: 200
name: Entwicklung
# Option 3: BEIDE kombinieren (meistens die beste Lösung!)
vlans:
- id: 100
name: Produktion
- id: 200
name: EntwicklungNach dem Editieren:
# Konflikt ist gelöst - Datei stagen
git add fabric.yaml
# Merge abschließen
git commit -m "Merge feature/vlan-200: Beide VLANs behalten"
# Push
git push- Kleine, fokussierte Commits (weniger Überlappung)
- Regelmäßig
git pullausführen - Kurze Branch-Lebenszeiten
- Mit dem Team kommunizieren: "Ich arbeite an fabric.yaml!"
6. Git History und Logs verstehen
Die Git-History ist Ihr Protokoll aller Änderungen. Richtig genutzt, beantwortet sie Fragen wie: "Wer hat das geändert?", "Wann wurde das eingeführt?" und "Was war der Grund?"
6.1 git log – Die Historie durchsuchen
# Einfache Historie (kompakt)
git log --oneline
# a1b2c3d VLAN 100 hinzugefügt
# d4e5f6g BGP Peer konfiguriert
# 7h8i9j0 Initial commit
# Letzte 5 Commits mit Details
git log -5
# Schöne grafische Darstellung
git log --oneline --graph --all
# Nach Autor filtern
git log --author="alice" --oneline
# Nach Datum filtern
git log --since="2024-01-01" --until="2024-01-31"
# Nach Suchbegriff in Commit-Message
git log --grep="VLAN" --oneline
# Änderungen an einer bestimmten Datei
git log --oneline -- fabric.yaml
# Mit Diff (was wurde geändert?)
git log -p -2 # Letzte 2 Commits mit Änderungen6.2 git diff – Unterschiede anzeigen
# Nicht gestaged Änderungen vs. letzte Version
git diff
# Gestagte Änderungen vs. letzte Version
git diff --staged
# Unterschied zwischen zwei Commits
git diff a1b2c3d d4e5f6g
# Unterschied zwischen Branches
git diff main feature/vlan-200
# Nur Dateinamen anzeigen (nicht den Inhalt)
git diff --name-only main feature/vlan-200
# Änderungen einer bestimmten Datei
git diff fabric.yaml6.3 git blame – Wer hat diese Zeile geschrieben?
Das mächtigste Werkzeug für Debugging: Zeigt für jede Zeile, wer sie zuletzt geändert hat.
# Blame für eine Datei
git blame fabric.yaml
# Ausgabe:
# a1b2c3d (Alice 2024-01-15 10:30) vlans:
# a1b2c3d (Alice 2024-01-15 10:30) - id: 100
# d4e5f6g (Bob 2024-01-16 14:22) name: Produktion ← Bob hat das geändert!
# 7h8i9j0 (Alice 2024-01-15 10:30) - id: 200
# Nur bestimmte Zeilen (10-20)
git blame -L 10,20 fabric.yaml
# Ignoriert Whitespace-Änderungen
git blame -w fabric.yamlTrotz des Namens geht es bei git blame nicht um Schuld! Es ist ein Werkzeug, um herauszufinden, wen Sie nach dem "Warum" einer Änderung fragen können. Die Person weiß am besten, was sie sich dabei gedacht hat.
6.4 git show – Details zu einem Commit
# Details zum letzten Commit
git show
# Details zu einem spezifischen Commit
git show a1b2c3d
# Nur die geänderten Dateinamen
git show --stat a1b2c3d
# Eine bestimmte Datei aus einem alten Commit anzeigen
git show a1b2c3d:fabric.yaml6.5 Änderungen rückgängig machen
# Lokale Änderungen verwerfen (nicht gestaged)
git restore fabric.yaml
# Gestagte Änderungen zurück ins Working Directory
git restore --staged fabric.yaml
# Letzten Commit rückgängig machen (behält Änderungen)
git reset --soft HEAD~1
# Letzten Commit komplett löschen (Änderungen weg!)
git reset --hard HEAD~1
# Einen Commit "umkehren" (neuer Commit, der alte Änderung rückgängig macht)
git revert a1b2c3d
# ☝️ Sicher für geteilte Branches! Erzeugt neuen Commit.git reset– Ändert die History. Niemals auf geteilten Branches nutzen!git revert– Erstellt neuen Commit. Sicher für geteilte Branches.
Faustregel: Alles, was Sie gepusht haben, nur mit revert rückgängig machen!
7. Praxis-Übungen
Jetzt wird es praktisch! Die folgenden 6 Übungen decken alle wichtigen Git-Operationen ab. Arbeiten Sie diese der Reihe nach durch.
Klonen Sie das Schulungsrepository und machen Sie sich damit vertraut.
- Repository klonen:📄 Terminal
git clone https://gitlab.local/schulung/ihr-name.git cd ihr-name - Struktur erkunden:📄 Terminal
# Was ist im Ordner? ls -la # Git-Ordner anschauen (hier ist die Magic!) ls -la .git # Aktueller Status git status # Welcher Branch? git branch # Remotes konfiguriert? git remote -v - Historie anschauen:📄 Terminal
# Commit-History git log --oneline -10 # Grafische Darstellung git log --oneline --graph --all
Erstellen Sie eine neue Datei und committen Sie diese.
- Neue YAML-Datei erstellen:📄 Terminal
cat > vlans.yaml << 'EOF' # VLAN-Konfiguration für mein Netzwerk vlans: - id: 100 name: Produktion description: Produktionsserver - id: 200 name: Entwicklung description: Entwicklungsumgebung EOF - Status prüfen – Datei ist "untracked":📄 Terminal
git status # Untracked files: # vlans.yaml - Datei stagen:📄 Terminal
git add vlans.yaml git status # Changes to be committed: # new file: vlans.yaml (grün!) - Commit erstellen:📄 Terminal
git commit -m "VLAN-Konfiguration hinzugefügt: Prod + Dev" # Erfolgsmeldung: # [main abc1234] VLAN-Konfiguration hinzugefügt: Prod + Dev # 1 file changed, 11 insertions(+) - Push zum Server:📄 Terminal
git push
Erstellen Sie einen Feature-Branch und arbeiten Sie darin.
- Neuen Branch erstellen:📄 Terminal
# Branch erstellen UND wechseln git checkout -b feature/vlan-300 # Prüfen, auf welchem Branch wir sind git branch # * feature/vlan-300 # main - Änderung im neuen Branch machen:📄 Terminal
cat >> vlans.yaml << 'EOF' - id: 300 name: Gaeste description: Gastnetzwerk mit Internet-Zugang EOF - Committen:📄 Terminal
git add vlans.yaml git commit -m "VLAN 300 für Gäste hinzugefügt" - Branch zum Server pushen:📄 Terminal
git push -u origin feature/vlan-300 # ☝️ -u setzt den "upstream" für künftige Pushes - Branches vergleichen:📄 Terminal
# Was ist in feature, aber nicht in main? git log main..feature/vlan-300 --oneline # Unterschiede anzeigen git diff main feature/vlan-300
Mergen Sie Ihren Feature-Branch zurück in main.
- Zurück zum main Branch:📄 Terminal
git checkout main # Prüfen: VLAN 300 ist hier noch NICHT! cat vlans.yaml - Feature-Branch mergen:📄 Terminal
git merge feature/vlan-300 # Ausgabe: # Updating abc1234..def5678 # Fast-forward # vlans.yaml | 4 ++++ # 1 file changed, 4 insertions(+) - Ergebnis prüfen:📄 Terminal
# Jetzt ist VLAN 300 auch in main! cat vlans.yaml # Log zeigt den Merge git log --oneline -5 - Push und aufräumen:📄 Terminal
git push # Feature-Branch lokal löschen git branch -d feature/vlan-300 # Feature-Branch remote löschen git push origin --delete feature/vlan-300
Diese Übung simuliert einen echten Merge-Konflikt – die wichtigste Übung!
- Zwei Branches erstellen, die das Gleiche ändern:📄 Terminal
# Stellen Sie sicher, Sie sind auf main git checkout main # Branch A erstellen git checkout -b feature/mtu-change-alice # MTU ändern cat > interfaces.yaml << 'EOF' interfaces: Ethernet1: description: Uplink to Spine mtu: 9000 EOF git add interfaces.yaml git commit -m "MTU auf 9000 gesetzt (Jumbo Frames)" - Zurück zu main und zweiten Branch erstellen:📄 Terminal
git checkout main # Branch B erstellen (basiert auf main OHNE Alices Änderung!) git checkout -b feature/mtu-change-bob # Bob setzt anderen MTU-Wert cat > interfaces.yaml << 'EOF' interfaces: Ethernet1: description: Uplink to Spine mtu: 1500 EOF git add interfaces.yaml git commit -m "MTU auf Standard 1500 belassen" - Alice zuerst mergen (kein Problem):📄 Terminal
git checkout main git merge feature/mtu-change-alice # ✅ Fast-forward, alles gut - Bob mergen → KONFLIKT!📄 Terminal
git merge feature/mtu-change-bob # 💥 CONFLICT (content): Merge conflict in interfaces.yaml # Automatic merge failed; fix conflicts and then commit. git status # both modified: interfaces.yaml - Konflikt anschauen:📄 interfaces.yaml
interfaces: Ethernet1: description: Uplink to Spine <<<<<<< HEAD mtu: 9000 ======= mtu: 1500 >>>>>>> feature/mtu-change-bob - Konflikt lösen – Sie entscheiden für 9000:📄 Terminal
cat > interfaces.yaml << 'EOF' interfaces: Ethernet1: description: Uplink to Spine mtu: 9000 EOF - Merge abschließen:📄 Terminal
git add interfaces.yaml git commit -m "Merge: MTU 9000 beibehalten (Jumbo Frames benötigt)" git push - Aufräumen:📄 Terminal
git branch -d feature/mtu-change-alice git branch -d feature/mtu-change-bob
Nutzen Sie die Git-Werkzeuge, um die Historie zu verstehen.
- Commit-Historie durchsuchen:📄 Terminal
# Alle Commits anzeigen git log --oneline # Commits mit MTU im Namen finden git log --grep="MTU" --oneline # Grafische Darstellung (zeigt Merge) git log --oneline --graph --all - Blame nutzen:📄 Terminal
# Wer hat welche Zeile geschrieben? git blame interfaces.yaml # Blame für vlans.yaml git blame vlans.yaml - Änderungen zwischen Commits:📄 Terminal
# Ersten und letzten Commit-Hash finden git log --oneline # Diff zwischen zwei Commits git diff <erster-hash> <letzter-hash> # Was hat sich an einer Datei geändert? git log -p vlans.yaml - Einen alten Zustand anschauen (ohne zu ändern!):📄 Terminal
# Datei aus altem Commit anzeigen (NICHT auschecken!) git show HEAD~3:vlans.yaml # Zurück zur aktuellen Version git checkout main
8. Cheat Sheet & Troubleshooting
📋 Git Cheat Sheet – Komplettübersicht
Basis-Befehle
Branches
Historie
Rückgängig machen
🔥 Häufige Fehler und Lösungen
Sie sind nicht in einem Git-Ordner.
Jemand hat Änderungen gepusht, die Sie noch nicht haben.
Der Server hat neuere Commits als Sie.
Sie wollen den Branch wechseln, haben aber ungespeicherte Änderungen.
Zwei Änderungen an der gleichen Stelle.
SSH-Key nicht konfiguriert oder falsch.
Ein Commit auf dem Server muss rückgängig gemacht werden.
⚠️ NICHT git reset auf geteilten Branches!
⚡ Zeit sparen: Git Aliases einrichten
Fügen Sie diese Zeilen zu Ihrer ~/.gitconfig hinzu:
[alias]
# Kurzbefehle
st = status
co = checkout
br = branch
ci = commit
# Schöne Logs
lg = log --oneline --graph --all
last = log -1 HEAD
# Schnelles Committen
ac = !git add -A && git commit -m
# Branch-Übersicht
branches = branch -a
# Wer hat was gemacht?
who = shortlog -sneNutzung: git st statt git status,git lg für schöne Logs, etc.
Zusammenfassung
✅ Das haben Sie gelernt
Konzepte
- ☑️ Die drei Zonen: Working Dir, Staging, Repository
- ☑️ Branches als parallele Entwicklungslinien
- ☑️ GitFlow vs. Trunk-Based Development
- ☑️ Wie Merge-Konflikte entstehen und gelöst werden
Praktische Skills
- ☑️ Repository klonen und erkunden
- ☑️ Änderungen committen und pushen
- ☑️ Branches erstellen, wechseln, mergen
- ☑️ History mit log, diff, blame analysieren
- ☑️ Konflikte erkennen und lösen
Im nächsten Modul lernen Sie GitLab kennen – die Plattform, die Git um Merge Requests, CI/CD-Pipelines und Kollaborationsfeatures erweitert. Dort setzen wir alles zusammen, was Sie hier gelernt haben!