📦 Git & Versionskontrolle
Änderungen nachvollziehen, sicher experimentieren und gemeinsam an Code arbeiten – verständlich erklärt und direkt zum Ausprobieren.
🛠️ Empfohlene Tools für Entwickler
Diese Tools nutze ich selbst – sie helfen Ihnen, Ihre Projekte professionell umzusetzen und zu vermarkten.
⚡ ExeOutput for PHP
PHP-Anwendungen in eigenständige Windows-EXE-Dateien kompilieren – ideal für die Auslieferung Ihrer Web-Anwendungen.
Jetzt ansehen →📄 HTML Executable
HTML-Dateien und Websites als eigenständige Windows-EXE-Dateien kompilieren – perfekt für Offline-Distribution.
Jetzt ansehen →🔒 XLS Padlock
Excel-Arbeitsmappen als EXE kompilieren und schützen – ideal für datenbank-gestützte Excel-Lösungen.
Jetzt ansehen →🐍 VBA Padlock
VBA-Code kompilieren und Office-Lösungen verkaufen – ohne Source-Code-Weitergabe.
Jetzt ansehen →📦 Paquet Builder
Professionelle Windows-Installationsprogramme für Ihre Anwendungen erstellen.
Jetzt ansehen →* Affiliate-Links: Bei einem Kauf über diese Links erhalten wir eine kleine Provision – für Sie entstehen keine zusätzlichen Kosten.
1. Was ist Git?
Git ist ein verteiltes Versionskontrollsystem. Es speichert nachvollziehbare Zwischenstände eines Projekts, sodass Änderungen verglichen, gemeinsam bearbeitet und bei Bedarf gezielt zurückgenommen werden können.
Versionsgeschichte
Jeder Commit dokumentiert einen ausgewählten Projektstand mit Autor, Zeitpunkt und kurzer Nachricht.
Sicher experimentieren
Branches ermöglichen neue Funktionen oder Tests, ohne den stabilen Hauptstand sofort zu verändern.
Zusammenarbeiten
Mehrere Personen können Änderungen austauschen, prüfen und kontrolliert zusammenführen.
Was Git nicht automatisch erledigt
- Git entscheidet nicht selbst, welche Änderungen fachlich richtig sind.
- Ein Commit entsteht erst, wenn Änderungen bewusst ausgewählt und gespeichert werden.
- Ein lokales Repository ist noch kein externes Backup.
- Große Binärdateien und Zugangsdaten gehören nicht einfach in die Versionsgeschichte.
2. Git, GitHub und GitLab – der Unterschied
Git und Hosting-Plattformen werden häufig verwechselt. Sie erfüllen jedoch verschiedene Aufgaben.
Git
Das Versionskontrollsystem, das auf dem eigenen Computer arbeitet. Es verwaltet Commits, Branches und die Projektgeschichte.
Git-Plattform
Ein Dienst, der Git-Repositories auf einem entfernten Server bereitstellt und zusätzliche Funktionen für Zusammenarbeit anbietet.
Pull oder Merge Request
Ein geregelter Vorschlag, Änderungen aus einem Branch zu prüfen, zu diskutieren und anschließend zusammenzuführen.
3. Die vier Arbeitsbereiche
Der Git-Ablauf wird verständlicher, wenn du die Bereiche kennst, zwischen denen Änderungen bewegt werden.
| Bereich | Bedeutung | Typische Befehle |
|---|---|---|
| Arbeitsverzeichnis | Aktuell sichtbare und bearbeitete Dateien. | git status, git diff |
| Staging Area | Bewusst für den nächsten Commit ausgewählte Änderungen. | git add, git restore --staged |
| Lokales Repository | Auf dem eigenen Computer gespeicherte Commits. | git commit, git log |
| Remote-Repository | Entfernte Kopie für Austausch und Zusammenarbeit. | git fetch, git pull, git push |
git add erstellt noch keinen dauerhaften Commit, und git commit überträgt noch nichts auf einen entfernten Server. Erst git push veröffentlicht lokale Commits im verbundenen Remote-Repository.
4. Installation prüfen und Git einrichten
Nach der Installation solltest du zuerst prüfen, ob Git im Terminal verfügbar ist. Anschließend werden Name und E-Mail-Adresse für neue Commits festgelegt.
git --version
git config --global user.name "Vorname Nachname"
git config --global user.email "name@example.de"
# Konfiguration kontrollieren
git config --global --list
Die Option --global gilt für alle Repositorys dieses Benutzerkontos. Ohne diese Option kann eine abweichende Einstellung nur für das aktuelle Repository gesetzt werden.
5. Repository erstellen oder klonen
Variante A: vorhandenen Projektordner initialisieren
cd mein-projekt
git init
git status
git add .
git commit -m "Projektgrundlage anlegen"
git branch -M main
git init richtet im aktuellen Ordner ein lokales Repository ein. Vor git add . sollte mit git status und git diff kontrolliert werden, welche Dateien aufgenommen werden.
Variante B: vorhandenes Repository klonen
git clone https://example.com/team/mein-projekt.git
cd mein-projekt
git status
git clone lädt Dateien, Commit-Geschichte und Remote-Verbindung. Die Beispieladresse muss durch die echte HTTPS- oder SSH-Adresse des Repositorys ersetzt werden.
git init erforderlich.
6. Der tägliche Git-Arbeitsablauf
Ein sauberer Ablauf besteht aus Prüfen, Auswählen, Kontrollieren, Committen und anschließendem Austauschen mit dem Remote-Repository.
-
1
Status prüfen
git statuszeigt neue, veränderte und bereits vorgemerkte Dateien. -
2
Änderungen vergleichen
git diffzeigt noch nicht vorgemerkte Unterschiede. -
3
Gezielt stagen
git add datei.htmlnimmt eine passende Änderung in die Staging Area auf. -
4
Staging Area kontrollieren
git diff --stagedzeigt genau den Inhalt des nächsten Commits. -
5
Commit erstellen
git commit -m "Navigation mobil optimieren"speichert den ausgewählten Stand lokal. -
6
Commits austauschenErst aktuelle Remote-Änderungen integrieren und anschließend mit
git pushveröffentlichen.
git status
git diff
git add index.html css/style.css
git diff --staged
git commit -m "Startseite responsiv optimieren"
git pull --ff-only
git push
git add . ist bequem, kann aber unbeabsichtigt Testdateien oder sensible Konfigurationen einschließen. Bei wichtigen Änderungen ist die explizite Angabe der Dateien übersichtlicher.
7. Branches und Zusammenführen
Ein Branch ist eine bewegliche Entwicklungslinie. Neue Funktionen können dort entstehen, während der Hauptbranch stabil bleibt.
Feature-Branch erstellen und zusammenführen
# Neuen Branch erstellen und direkt wechseln
git switch -c feature/kontaktformular
# Änderungen bearbeiten, prüfen und committen
git status
git add kontakt.html js/formular.js
git commit -m "Kontaktformular validieren"
# Hauptbranch aktualisieren und Feature zusammenführen
git switch main
git pull --ff-only
git merge feature/kontaktformular
git push
# Nicht mehr benötigten lokalen Branch entfernen
git branch -d feature/kontaktformular
| Befehl | Aufgabe |
|---|---|
git branch | Lokale Branches anzeigen. |
git switch name | Zu einem vorhandenen Branch wechseln. |
git switch -c name | Neuen Branch erstellen und direkt wechseln. |
git merge name | Den angegebenen Branch in den aktuellen Branch zusammenführen. |
git branch -d name | Einen bereits zusammengeführten lokalen Branch löschen. |
git status, ob offene Änderungen vorhanden sind. Committe sie sinnvoll, stage sie gezielt oder sichere sie bewusst, bevor du den Branch wechselst.
8. Remote-Repository und Zusammenarbeit
Ein Remote ist eine benannte Verbindung zu einem entfernten Repository. Der häufig verwendete Standardname lautet origin, ist aber technisch frei wählbar.
# Verbindungen anzeigen
git remote -v
# Remote zu einem lokalen Repository hinzufügen
git remote add origin https://example.com/team/mein-projekt.git
# Hauptbranch erstmalig übertragen und verknüpfen
git push -u origin main
Fetch, Pull und Push unterscheiden
git fetch
Lädt Informationen und Commits vom Remote, verändert den aktuellen Arbeitsstand aber nicht automatisch.
git pull
Holt Remote-Änderungen und integriert sie gemäß der gewählten Pull-Strategie in den aktuellen Branch.
git push
Überträgt lokale Commits in den zugeordneten Branch des Remote-Repositorys.
Ein einfacher Teamablauf
- 1Aktuellen Stand holenVor Arbeitsbeginn den relevanten Branch aktualisieren.
- 2Feature-Branch erstellenEine Aufgabe in einer getrennten Entwicklungslinie bearbeiten.
- 3Kleine Commits erstellenZusammengehörige Änderungen mit verständlichen Nachrichten speichern.
- 4Branch pushenDen Feature-Branch zum Remote-Repository übertragen.
- 5Änderungen prüfen lassenPull beziehungsweise Merge Request erstellen und Rückmeldungen bearbeiten.
9. .gitignore und sensible Daten
Die Datei .gitignore legt fest, welche noch nicht verfolgten Dateien oder Ordner Git normalerweise ignorieren soll. Typische Beispiele sind Abhängigkeiten, temporäre Dateien, Build-Ausgaben und lokale Konfigurationen.
# Abhängigkeiten
node_modules/
# Build-Ausgaben
dist/
build/
# Lokale Umgebungsvariablen
.env
.env.local
# Protokolle und Editor-Einstellungen
*.log
.idea/
.vscode/
Bereits verfolgte Datei ignorieren
Wurde eine harmlose Datei bereits committet, reicht ein neuer Eintrag in .gitignore nicht aus. Sie kann aus der Git-Verfolgung entfernt werden, ohne die lokale Datei zu löschen:
git rm --cached pfad/zur/datei
git commit -m "Lokale Konfiguration nicht mehr versionieren"
10. Merge-Konflikte verstehen und lösen
Ein Konflikt entsteht, wenn Git verschiedene Änderungen nicht eindeutig automatisch zusammenführen kann. Das ist kein Defekt, sondern eine Aufforderung zur fachlichen Entscheidung.
So kann ein Konflikt in einer Datei aussehen
<<<<<<< HEAD
<h1>Willkommen bei Digitale Start-Hilfe</h1>
=======
<h1>Professionelle Web-Entwicklung</h1>
>>>>>>> feature/neue-headline
- 1Konflikte anzeigen
git statusnennt die betroffenen Dateien. - 2Inhalt fachlich entscheidenKonfliktmarkierungen entfernen und die gewünschte Endfassung schreiben.
- 3Ergebnis testenSeite oder Anwendung ausführen und die zusammengeführte Änderung prüfen.
- 4Lösung stagenDie bereinigten Dateien mit
git addals gelöst markieren. - 5Vorgang abschließenJe nach Ausgangsvorgang Merge oder Rebase fortsetzen beziehungsweise committen.
git status
git add index.html
git commit
11. Änderungen sicher rückgängig machen
Der richtige Befehl hängt davon ab, ob eine Änderung nur im Arbeitsverzeichnis liegt, bereits gestaged, lokal committet oder schon veröffentlicht wurde.
| Situation | Geeigneter Befehl | Wirkung |
|---|---|---|
| Datei ist verändert, aber nicht gestaged | git restore datei.html | Verwirft die nicht committete Änderung dieser Datei. |
| Datei wurde versehentlich gestaged | git restore --staged datei.html | Nimmt die Datei aus der Staging Area; die Bearbeitung bleibt erhalten. |
| Letzte Commit-Nachricht ist falsch und noch nicht geteilt | git commit --amend -m "Neue Nachricht" | Ersetzt den letzten lokalen Commit. |
| Veröffentlichter Commit soll neutralisiert werden | git revert COMMIT-ID | Erstellt einen neuen Gegen-Commit und bewahrt die Geschichte. |
| Neue, nicht verfolgte Datei wird nicht gebraucht | Manuell prüfen und löschen | Git schützt unversionierte Dateien nicht automatisch. |
git reset --hard oder git clean -fd können nicht gesicherte Arbeit unwiederbringlich entfernen. Nutze sie nicht, solange Ziel, Auswirkungen und Sicherung nicht eindeutig geklärt sind.
git revert häufig die nachvollziehbarere Wahl, weil keine gemeinsam verwendete Geschichte umgeschrieben wird.
12. Stashing – Änderungen zwischenspeichern
Stashing erlaubt es, unfertige Änderungen zwischenzuspeichern, ohne sie zu committen. Das ist praktisch, wenn du schnell den Branch wechseln musst.
# Aktuelle Änderungen zwischenspeichern
git stash
# Stash-Liste anzeigen
git stash list
# Letzten Stash wieder anwenden und entfernen
git stash pop
# Letzten Stash anwenden (behalten)
git stash apply
# Stash mit Beschreibung
git stash push -m "Navigation in Arbeit"
🎯 Live-Demo: Stashing simulieren
Simuliere das Zwischenspeichern von Änderungen:
git stash push -m "Beschreibung"
hilft, mehrere Stashes voneinander zu unterscheiden.
13. Tags – Versionen markieren
Tags sind feste Markierungen für bestimmte Commits. Sie werden oft verwendet, um Release-Versionen (v1.0, v2.0) zu kennzeichnen.
# Leichten Tag erstellen (nur Name)
git tag v1.0.0
# Annotierten Tag mit Nachricht
git tag -a v1.0.0 -m "Release Version 1.0.0"
# Tags anzeigen
git tag
# Tag zu Remote übertragen
git push origin v1.0.0
# Alle Tags übertragen
git push --tags
| Tag-Typ | Beschreibung | Befehl |
|---|---|---|
| Leichter Tag | Nur ein Name, ohne Zusatzinformationen | git tag name |
| Annotierter Tag | Mit Nachricht, Datum und Autor | git tag -a name -m "Nachricht" |
🎯 Live-Demo: Tags simulieren
Simuliere das Erstellen von Versionstags:
14. Rebase vs. Merge
Beide Befehle integrieren Änderungen, aber auf unterschiedliche Weise. Merge erstellt einen Merge-Commit, während Rebase die Commit-Historie umschreibt.
Merge
Erstellt einen neuen Merge-Commit, der beide Entwicklungslinien verbindet. Die Historie bleibt erhalten.
Vorteil: Nachvollziehbar, sicher für gemeinsam genutzte Branches.
Nachteil: Kann die Historie unübersichtlich machen.
Rebase
Schreibt die Commits eines Branches neu und platziert sie auf die Spitze eines anderen Branches.
Vorteil: Saubere, lineare Historie.
Nachteil: Kann bei gemeinsam genutzten Branches zu Problemen führen.
# Merge (behält Historie)
git checkout main
git merge feature-branch
# Rebase (schreibt Historie um)
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch
rebase verändert Commit-Hashes
und kann bei anderen Entwicklern zu Konflikten führen.
🎯 Live-Demo: Rebase vs. Merge
Wähle eine Methode und simuliere den Ablauf:
15. Git-Hooks – Automatisierung
Git-Hooks sind Skripte, die bei bestimmten Git-Ereignissen automatisch ausgeführt werden. Sie können beispielsweise Tests vor dem Commit ausführen oder Nachrichten-Formate prüfen.
# pre-commit – Läuft vor dem Commit
#!/bin/sh
# Führt Tests aus, bevor der Commit erstellt wird
npm test
# commit-msg – Prüft Commit-Nachricht
#!/bin/sh
# Stellt sicher, dass die Commit-Nachricht ein bestimmtes Format hat
grep -q "^(feat|fix|docs|style|refactor|test|chore)" $1
| Hook | Ausführungszeitpunkt | Typische Verwendung |
|---|---|---|
| pre-commit | Vor dem Commit | Tests ausführen, Code-Formatierung prüfen |
| commit-msg | Nach Eingabe der Commit-Nachricht | Commit-Nachricht auf Format prüfen |
| pre-push | Vor dem Push | Tests ausführen, Build prüfen |
| post-commit | Nach dem Commit | Benachrichtigungen senden |
| post-receive | Nach Empfang auf Server | Deployment auslösen |
16. Submodule – externe Repositories einbinden
Submodule ermöglichen es, ein anderes Git-Repository als Unterverzeichnis in dein eigenes Repository einzubinden. Das ist nützlich für gemeinsame Bibliotheken oder Tools.
# Submodule hinzufügen
git submodule add https://example.com/team/shared-library.git libs/shared
# Submodule initialisieren und aktualisieren
git submodule update --init --recursive
# Submodule auf neuesten Stand bringen
git submodule update --remote
17. Gute Commits und Best Practices
Ein Thema pro Commit
Fasse zusammengehörige Änderungen zusammen. Vermische keine neue Funktion, Formatierung und Fehlerkorrektur ohne Grund.
Klare Nachricht
Beschreibe knapp, was der Commit bewirkt, zum Beispiel „Kontaktformular validieren“ statt „Änderungen“.
Vorher testen
Prüfe Funktion, Tests und relevante Darstellung, bevor der Commit oder Pull Request geteilt wird.
Diff kontrollieren
git diff --staged hilft, versehentliche Debug-Ausgaben, fremde Dateien oder Geheimnisse zu erkennen.
Gute und schwache Commit-Nachrichten
| Schwach | Besser | Warum? |
|---|---|---|
Update | Navigation auf Mobilgeräten korrigieren | Die Wirkung ist sofort erkennbar. |
Fix | Doppelte Formularübermittlung verhindern | Das konkrete Problem wird benannt. |
Neue Dateien | FAQ-Komponente hinzufügen | Der fachliche Zweck steht im Mittelpunkt. |
CSS | Preiskarten responsiv anordnen | Die sichtbare Änderung ist nachvollziehbar. |
18. Interaktiver Git-Befehlshelfer
Wähle eine typische Aufgabe. Der Helfer zeigt dir einen passenden Ausgangspunkt und erklärt kurz die Wirkung.
Was möchtest du tun?
Die angezeigten Befehle sind Beispiele. Prüfe vor der Ausführung immer Repository, Branch und Dateinamen.
19. Checkliste für dein erstes Git-Projekt
Hake die erledigten Punkte ab. Die Auswahl bleibt nur während dieses Seitenaufrufs erhalten.
0 von 10 Punkten erledigt
20. Häufige Fehler und Lösungen
„Not a git repository“
Ursache: Das Terminal befindet sich nicht innerhalb eines Git-Repositorys.
Prüfen: Mit pwd beziehungsweise cd in den richtigen Projektordner wechseln und git status erneut ausführen.
Push wird abgelehnt
Ursache: Der Remote-Branch enthält möglicherweise Commits, die lokal fehlen.
Prüfen: Remote-Änderungen abrufen, Unterschiede ansehen, sauber integrieren und erst danach erneut pushen. Kein erzwungenes Pushen ohne klare Teamabsprache.
Datei trotz .gitignore
Ursache: Die Datei wurde bereits verfolgt, bevor sie ignoriert wurde.
Lösung: Bei einer unkritischen Datei das Tracking mit git rm --cached beenden und anschließend committen.
Falscher Branch bearbeitet
Ursache: Vor Arbeitsbeginn wurde der aktuelle Branch nicht geprüft.
Prüfen: git status und git branch --show-current verwenden; offene Arbeit anschließend bewusst sichern und korrekt zuordnen.
21. Übungen zum Mitmachen
Lege für die Übungen am besten einen neuen Testordner ohne wichtige Dateien an.
Ersten Commit erstellen
Initialisiere ein Repository, erstelle eine index.html, prüfe den Unterschied und speichere den ersten Commit.
Staging verstehen
Ändere zwei Dateien, stage nur eine und vergleiche git diff mit git diff --staged.
Feature-Branch verwenden
Erstelle einen Branch, ergänze eine Navigation, committe die Änderung und führe den Branch in main zusammen.
Änderung zurücknehmen
Ändere eine Testdatei und verwende git restore. Wiederhole die Änderung, committe sie und teste anschließend git revert.
Stashing ausprobieren
Ändere eine Datei, verwende git stash, wechsle den Branch und wende den Stash wieder an.
Tag erstellen
Nach einem Commit einen annotierten Tag (git tag -a) erstellen und mit git log --oneline überprüfen.
Mini-Projekt: Webseite versionieren
- 1Grundlage anlegenErstelle HTML-, CSS- und JavaScript-Datei mit einer einfachen Startseite.
- 2Ersten Stand sichernPrüfe alle Dateien und erstelle einen klar benannten Anfangs-Commit.
- 3Feature entwickelnBaue in einem Branch einen Über-mich-Abschnitt ein.
- 4Unterschiede prüfenUntersuche die Änderung mit
git diffundgit log --oneline. - 5ZusammenführenMerge das getestete Feature und lösche danach den nicht mehr benötigten Branch.
- 6Release-Tag setzenErstelle einen annotierten Tag für den aktuellen Stand.
22. Häufige Fragen zu Git
Speichert Git automatisch jede Änderung?
Nein. Git erkennt veränderte Dateien, aber ein neuer Projektstand entsteht erst durch bewusstes Staging und einen Commit. Nicht committete Änderungen können verloren gehen.
Was ist der Unterschied zwischen Commit und Push?
Ein Commit speichert einen Stand im lokalen Repository. Push überträgt lokale Commits in ein verbundenes Remote-Repository. Ohne Push bleiben die Commits nur lokal.
Kann ich Git auch allein verwenden?
Ja. Git ist auch für Einzelprojekte sehr nützlich, weil Änderungen nachvollziehbar bleiben und Experimente in Branches getrennt werden können. Ein Remote-Repository bietet zusätzlich eine externe Kopie und erleichtert den Gerätewechsel.
Wann sollte ich einen neuen Branch erstellen?
Ein Branch ist sinnvoll, wenn eine Funktion, Fehlerkorrektur oder ein Experiment getrennt entwickelt und geprüft werden soll. Kleine Teams sollten gemeinsam festlegen, wie fein Branches zugeschnitten werden.
Was bedeutet „detached HEAD“?
Dann zeigt HEAD direkt auf einen bestimmten Commit statt auf einen normalen Branch. Änderungen können getestet werden, sollten aber vor weiterer Arbeit bewusst in einem neuen Branch gesichert werden, wenn sie erhalten bleiben sollen.
Warum fragt Git nach Name und E-Mail?
Diese Angaben werden als Urheberinformation in neue Commits geschrieben. Sie helfen, Änderungen zuzuordnen, und sind Teil der Repository-Geschichte.
Ist Git ein vollständiges Backup?
Nein. Git schützt vor allem versionierte Projektdateien. Nicht committete Dateien, Datenbanken, große Medien, Zugangsdaten und externe Systeme benötigen eine eigene Backup-Strategie.
Sollte ich git push --force verwenden?
Nicht ohne genaue Kenntnis der Auswirkungen und klare Teamabsprache. Ein erzwungener Push kann Remote-Geschichte überschreiben und Arbeit anderer Personen unzugänglich machen. Für normale Zusammenarbeit ist er in der Regel nicht erforderlich.
Was ist der Unterschied zwischen Stash und Commit?
Ein Commit speichert einen dauerhaften Projektstand mit Nachricht. Ein Stash ist ein temporärer Zwischenspeicher für unfertige Änderungen, die später wieder angewendet werden können.
Wann sollte ich Tags verwenden?
Tags sind ideal für Release-Versionen (v1.0.0, v2.0.0) oder wichtige Meilensteine. Sie sind festere Markierungen als Branches und eignen sich gut für die Dokumentation von Veröffentlichungen.
Hinweis: Probiere neue Git-Befehle zuerst in einem Test-Repository aus. Prüfe vor Befehlen, die Dateien oder Geschichte verändern, immer den aktuellen Status und Branch.