Git Praxisguide
Versionskontrolle im Projektalltag – praxisnah erklärt für Entwickler, die mit einem zentralen Repository arbeiten.
1Konzepte & Das Drei-Ebenen-Modell
Git ist ein verteiltes Versionskontrollsystem. Es speichert nicht einfach Dateiversionen, sondern eine vollständige Geschichte aller Änderungen – wer was wann geändert hat – und erlaubt es mehreren Personen, gleichzeitig zu arbeiten.
Die wichtigsten Begriffe
| Begriff | Bedeutung |
|---|---|
| Repository (Repo) | Der Projektordner inklusive der gesamten Änderungshistorie (im .git-Unterordner) |
| Commit | Ein gespeicherter Schnappschuss – wie ein Spielstand. Unveränderlich, mit ID (SHA). |
| Branch | Ein paralleler Entwicklungsstrang. main ist typischerweise der stabile Stand. |
| Remote | Das zentrale, serverseitige Repository (z.B. GitHub, GitLab, internes Git-Server) |
| HEAD | Zeiger auf den aktuellen Commit – den Stand, den du gerade siehst |
| Staging Area / Index | Zwischenspeicher für Änderungen, die beim nächsten Commit gespeichert werden |
| Clone | Komplette Kopie eines Remote-Repos auf den lokalen Rechner |
| Fetch | Neue Commits vom Remote holen – Working Directory bleibt unverändert |
| Pull | Fetch + Merge in einem Schritt: aktuell halten |
| Push | Lokale Commits auf das Remote hochladen |
| Merge | Zwei Branches zusammenführen |
| Stash | Änderungen temporär wegsichern ohne Commit |
Das Drei-Ebenen-Modell
Das ist das wichtigste Konzept in Git. Wenn du dieses Modell verstehst, macht alles andere Sinn:
Jede Dateiänderung durchläuft diese vier Stationen
Working Directory = was du siehst | Staging Area = was du committen wirst | Repository = was gespeichert ist
2Erstkonfiguration
Vor dem ersten Commit müssen Name und E-Mail gesetzt werden – sie erscheinen in jedem Commit für immer.
# Einmalig global setzen (für alle Projekte)
git config --global user.name "Dein Name"
git config --global user.email "deine@email.de"
# Farbige Ausgabe aktivieren
git config --global color.ui auto
# Standard-Editor (z.B. VS Code)
git config --global core.editor "code --wait"
# Konfiguration prüfen
git config --list
In der Git GUI: Menü Edit → Options...
- User Name: Deinen Namen eintragen
- Email Address: E-Mail eintragen
- Unten auf Save klicken
Diese Einstellung beim allerersten Start vornehmen – sonst erscheinen falsche Angaben in den Commits.
3Repository starten
Neues lokales Repository anlegen
# Im gewünschten Ordner:
git init mein-projekt
cd mein-projekt
Vorhandenes Remote-Repository clonen einmalig
git clone https://github.com/org/repo.git
# In einen bestimmten Ordner clonen:
git clone https://github.com/org/repo.git mein-ordner
- Git GUI öffnen →
File → Clone... - Source Location: URL des Remote-Repos eingeben
- Target Directory: Lokalen Zielordner wählen
- Klick auf Clone
git clone machst du genau einmal pro Repository. Danach arbeitest du mit pull und fetch weiter.
4Täglicher Workflow
Dieser Abschnitt erklärt nicht nur was du tust, sondern warum, wann – und wann ausdrücklich nicht. Der Fokus liegt auf dem realen Arbeitsalltag mit einem zentralen Server-Repository und mehreren Branches.
4.1 Remote-Branches – was der Server weiß
Auf dem Server liegen Branches, die dein lokales Git kennt, aber nicht automatisch aktuell hält. Diese sogenannten Remote-Tracking-Branches haben das Präfix origin/:
| Name | Bedeutung |
|---|---|
| origin/main | Der Zustand von main auf dem Server – so wie Git ihn zuletzt gesehen hat (beim letzten fetch/pull) |
| origin/feature/login | Ein Feature-Branch, der auf dem Server existiert – egal ob du lokal schon damit gearbeitet hast |
| origin/HEAD | Zeiger auf den Standard-Branch des Remotes (meist main) |
origin/main ist kein Live-Spiegel des Servers. Er zeigt den Stand des letzten git fetch. Ohne Fetch weißt du nicht, was auf dem Server passiert ist.
4.2 Alle verfügbaren Branches anzeigen
Bevor du anfängst, verschaffe dir einen Überblick – besonders nach einem längeren Urlaub oder in einem neuen Projekt:
git branch # nur lokale Branches
# Ausgabe: * main ← * = aktueller Branch
# feature/login
git branch -r # nur Remote-Branches (was der Server hat)
# Ausgabe: origin/main
# origin/feature/login
# origin/feature/payment
git branch -a # alle: lokal + remote
# Ausgabe: * main
# feature/login
# remotes/origin/main
# remotes/origin/feature/login
# remotes/origin/feature/payment ← den kennst du noch nicht lokal!
# Übersichtlicher mit Tracking-Info (wer trackt wen?)
git branch -vv
# Ausgabe: * main a3f9d12 [origin/main] fix: Timeout erhöht
# feature/login b2e1c08 [origin/feature/login: ahead 2] feat: Formular
Was bedeutet "ahead 2"? Du hast 2 lokale Commits, die noch nicht auf dem Server sind. "behind 3" heißt: der Server hat 3 neue Commits, die du noch nicht hast.
- Im Menü
Branch → Checkout...erscheinen alle lokalen Branches - Für Remote-Branches:
Branch → Visualize All Branch Historyöffnet gitk – dort sind alle Branches (lokal + remote) grafisch sichtbar - Nach einem
Remote → Fetch from → origintauchen neue Remote-Branches in gitk auf
4.3 Einen Remote-Branch lokal auschecken
Der Server hat einen Branch (origin/feature/payment), den du lokal noch nicht hast. So holst du ihn:
# Schritt 1: Erst sicherstellen, dass du den aktuellen Server-Stand kennst
git fetch origin
# Schritt 2: Remote-Branch lokal auschecken (Git erstellt automatisch Tracking)
git checkout feature/payment
# Git erkennt: "origin/feature/payment" existiert → erstellt lokalen Branch mit Tracking
# Ausgabe: Branch 'feature/payment' set up to track remote branch 'feature/payment' from 'origin'.
# Alternative (explizit, gleiche Wirkung):
git checkout -b feature/payment origin/feature/payment
Ein Tracking-Branch weiß, welcher Remote-Branch sein "Gegenstück" ist. Das ermöglicht git pull ohne Parameter und zeigt ahead/behind-Info in git branch -vv.
Remote → Fetch from → originausführenBranch → Checkout...– in der Liste erscheinen jetzt auch Remote-Branches unterremotes/origin/...- Den gewünschten Remote-Branch auswählen → Git GUI erstellt automatisch einen lokalen Tracking-Branch
4.4 fetch – schauen bevor man handelt
git fetch ist der sicherste Befehl beim Synchronisieren. Er holt alle neuen Commits und Branch-Informationen vom Server, verändert aber weder dein Working Directory noch deine lokalen Branches.
| Wann fetch verwenden | Wann NICHT fetch genug ist |
|---|---|
| Du willst zuerst sehen, was auf dem Server passiert ist, bevor du integrierst | Wenn du einfach nur aktuell bleiben willst → dann direkt git pull |
| Du hast lokale Änderungen und willst keine Überraschungen beim Merge | Wenn du auf einem neuen Branch arbeitest, auf dem noch niemand sonst committ |
| Du willst prüfen, ob dein Kollege seinen Branch schon gepusht hat |
git fetch origin # alle Branches vom Remote "origin" holen
git fetch --all # falls du mehrere Remotes hast
git fetch --prune # gelöschte Remote-Branches lokal aufräumen
# Nach dem Fetch: was ist neu auf dem Server?
git log --oneline origin/main ^main # Commits, die origin/main hat, du aber noch nicht
git diff main origin/main # Was würde sich ändern beim Merge?
Wenn ein Kollege auf dem Server einen Branch löscht, bleibt er bei dir als origin/alter-branch erhalten – bis du git fetch --prune ausführst. Das ist kein Fehler, aber es lohnt sich, das regelmäßig zu machen.
4.5 pull – der Alltagsbefehl
git pull ist git fetch + git merge in einem Schritt. Er aktualisiert deinen aktuellen Branch mit dem Gegenstück auf dem Server.
| Szenario | Was passiert | Ergebnis |
|---|---|---|
Du bist auf main, Server hat 3 neue Commits, du hast keine lokalen | Fast-Forward: dein main-Zeiger wird einfach vorgerückt | Sauber, kein Merge-Commit |
Du bist auf main, beide Seiten haben neue Commits | Ein Merge-Commit wird erstellt | Merge-Commit in der Historie |
| Du hast uncommitted Änderungen | Git verweigert den Pull | Fehlermeldung → erst stashen oder committen |
git pull # aktuellen Branch vom Tracking-Remote aktualisieren
git pull origin main # explizit: von "origin" den Branch "main" holen
git pull --rebase # fetch + rebase statt merge
# Vorteil: keine Merge-Commits – sauberere, lineare Historie
# Nachteil: Commits werden neu "geschrieben" → SHA ändert sich
# Empfehlung: gut für Feature-Branches, vorsichtig auf shared main
Auf deinem eigenen Feature-Branch, den noch niemand sonst nutzt. Damit bleibt die Geschichte übersichtlich: deine Commits erscheinen nach den Server-Commits, ohne Extra-Merge-Commit.
# Du willst wissen, was auf einem anderen Branch neu ist,
# ohne selbst zu wechseln → fetch reicht:
git fetch origin feature/payment
# Den Stand von main in deinen aktuellen Feature-Branch einpflegen:
git merge origin/main # aus Remote-Tracking direkt mergen
# NICHT empfohlen: git pull origin main auf einem Feature-Branch
# (macht dasselbe, ist aber weniger explizit)
4.6 Was du nicht tun solltest
| Tu das nicht | Warum nicht | Mach stattdessen |
|---|---|---|
git pull mit uncommitted Änderungen | Git verweigert es oder erzeugt unerwünschte Merge-Commits | git stash → git pull → git stash pop |
Direkt auf main committen (im Team) | main ist der stabile Stand – direkte Commits riskieren Destabilisierung für alle | Eigenen Feature-Branch anlegen, dort arbeiten, dann mergen |
git push --force auf main oder shared Branches | Überschreibt die History anderer – Commits können unwiederbringlich verloren gehen | Nur auf deinem eigenen, nicht geteilten Branch – oder gar nicht |
| Tagelang lokal arbeiten ohne fetch | Du weißt nicht, was sich auf dem Server geändert hat – große Konflikte beim nächsten Merge | Täglich (morgens) git fetch oder git pull |
git fetch statt git pull verwechseln | Nach git fetch sind deine lokalen Dateien noch alt – du arbeitest auf veraltetem Stand | Nach git fetch noch git merge origin/main ausführen |
| Einen Remote-Branch direkt auschecken ohne fetch | Du siehst möglicherweise einen veralteten Stand | Immer erst git fetch, dann auschecken |
| Commits auf einem fremden Feature-Branch pushen ohne Absprache | Dein Kollege hat diesen Branch gerade in Arbeit – du erzeugst ihm Konflikte | Erst nachfragen, oder einen eigenen Branch von seinem abzweigen |
4.7 Täglicher Workflow – Solo auf eigenem Branch
Du arbeitest an feature/login, der Server hat einen gemeinsamen main. Ziel: täglich aktuell bleiben, ohne deinen Branch zu gefährden.
Morgens: Server-Stand holen
Erst schauen, was passiert ist – ohne irgendetwas zu verändern.
git fetch origin
# Zeigt: remote: Enumerating objects: 5, done.
# Jetzt weißt du: es gibt Neues, aber deine Dateien sind unverändert
# Optional: Was ist neu auf main?
git log --oneline origin/main ^feature/login
# → zeigt alle Commits auf main, die dein Branch noch nicht hat
Auf deinem Branch: main einpflegen
Neue Commits aus main in deinen Feature-Branch holen, damit du auf aktuellem Stand entwickelst.
git checkout feature/login # sicherstellen, dass du auf deinem Branch bist
git merge origin/main # Remote-main direkt einpflegen (kein Checkout nötig!)
# → Falls Konflikte: lösen, dann git add + git commit
Arbeiten und regelmäßig committen
Kleine, häufige Commits sind besser als ein riesiger Commit am Ende.
# Zwischendurch jederzeit:
git status # Überblick
git diff # Was hat sich konkret geändert?
# Gezielte Dateien stagen:
git add src/login.py
git diff --staged # nochmal prüfen bevor Commit
git commit -m "feat: Passwortfeld validierung"
Eigenen Branch zum Server pushen
git push # wenn Tracking schon eingerichtet
# Erster Push eines neuen Branches (Tracking einrichten):
git push -u origin feature/login
# -u = --set-upstream: zukünftige pulls/pushes auf diesem Branch kennen das Ziel
4.8 Täglicher Workflow – Im Team, mehrere Branches
Der Server hat viele Branches. Kollegen arbeiten parallel. So behältst du den Überblick:
# Alle Branches, die auf dem Server existieren:
git fetch --all --prune
git branch -a
# Wer hat wann was commitet? (grafisch, alle Branches)
git log --oneline --graph --all --decorate
# Sehr nützlich: zeigt, wie die Branches auseinanderlaufen
# Nur die Remote-Branches:
git branch -r --sort=-committerdate
# Sortiert nach letztem Commit – aktive Branches oben
# Kollege hat feature/payment auf dem Server – du willst es ansehen:
git fetch origin
git checkout feature/payment # Git erstellt lokalen Tracking-Branch
# Nur ansehen ohne zu wechseln (read-only Blick):
git log origin/feature/payment --oneline -10
git diff main origin/feature/payment # was hat der Branch gegenüber main?
# Zurück zu deinem Branch:
git checkout feature/login
# Feature ist fertig, Review OK – jetzt in main mergen:
# 1. main aktualisieren
git checkout main
git pull origin main
# 2. Feature-Branch mergen
git merge feature/login
# 3. Konfliktfrei? Dann pushen
git push origin main
# 4. Feature-Branch aufräumen (lokal + remote)
git branch -d feature/login # lokal löschen
git push origin --delete feature/login # auf dem Server löschen
In vielen Teams läuft der Merge in main über einen Pull Request / Merge Request auf dem Server (GitHub, GitLab) – nicht lokal. Das ermöglicht Code Review, bevor etwas in main landet.
4.9 Kurzreferenz: Das tägliche Minimum
| # | Aktion | CLI | Git GUI |
|---|---|---|---|
| 1 | Server-Stand holen | git fetch origin | Remote → Fetch from → origin |
| 2 | Was ist neu? | git log --oneline origin/main ^HEAD | Branch → Visualize All Branch History |
| 3 | main einpflegen | git merge origin/main | Merge → Local Merge → origin/main |
| 4 | Arbeiten | – | – |
| 5 | Stagen & Committen | git add . && git commit -m "..." | Rescan → Stage → Commit-Nachricht → Commit |
| 6 | Eigene Commits pushen | git push | Remote → Push oder Button Push |
5Status & Diff
Die wichtigsten Befehle zum Nachschauen, bevor man handelt.
| Befehl | Was es zeigt | Wann? |
|---|---|---|
| git status | Alle geänderten, neuen und gestagten Dateien | Jederzeit – der erste Griff |
| git diff | Änderungen im Working Directory (noch nicht gestaged) | Vor git add |
| git diff --staged | Änderungen, die im Index liegen (bereit zum Commit) | Vor git commit |
| git diff HEAD | Alle Änderungen seit letztem Commit (gestaged + ungestaged) | Überblick |
| git diff commit1 commit2 | Unterschied zwischen zwei Commits | Vergleich |
| git log --oneline | Kompakte Commit-Liste (ID + Nachricht) | Verlauf ansehen |
| git log --oneline --graph | Grafische Branch-Darstellung im Terminal | Branch-Überblick |
| git blame [datei] | Wer hat welche Zeile wann geändert? | Ursachenforschung |
| git show [commit] | Details eines bestimmten Commits | Commit untersuchen |
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>" to unstage)
modified: src/login.py ← gestaged (kommt in nächsten Commit)
Changes not staged for commit:
modified: config/local.cfg ← geändert, aber noch nicht gestaged
Untracked files:
notes.txt ← neu, Git kennt diese Datei noch nicht
- Klick auf Rescan – zeigt alle geänderten Dateien
- Oben links: Unstaged (geändert, noch nicht gestaged)
- Unten links: Staged (bereit zum Commit)
- Datei anklicken → rechts erscheint das Diff (grün = neu, rot = gelöscht)
6Staging & Commit
Dateien stagen
| Befehl | Erklärung |
|---|---|
| git add datei.py | Einzelne Datei in den Index legen |
| git add . | Alle geänderten Dateien im aktuellen Ordner stagen |
| git add src/ | Ganzen Unterordner stagen |
| git add -p | Interaktiv: einzelne Abschnitte (hunks) auswählen – sehr nützlich! |
| git restore --staged datei.py | Datei aus dem Index entfernen (unstage), ohne Änderungen zu löschen |
| git restore datei.py | Änderungen einer Datei vollständig verwerfen unwiderruflich |
Commit erstellen
git commit -m "feat: Suchfunktion implementiert"
# Alle bereits getrackten Dateien direkt committen (überspringt git add):
git commit -am "fix: Tippfehler in Fehlermeldung korrigiert"
# Letzten Commit nachträglich korrigieren (Nachricht oder vergessene Datei):
git commit --amend
Kurz und beschreibend im Imperativ: feat: Button hinzufügen, fix: Ladezeit verbessern, docs: README aktualisieren. Das Warum gehört in den Body, nicht den Subject.
# Kompletter Ablauf:
git status # Überblick
git diff # Was hat sich geändert?
git add src/login.py # Datei stagen
git diff --staged # Staged-Änderungen prüfen
git commit -m "feat: Login hinzugefügt"
- Klick auf Rescan
- Dateien einzeln anklicken und mit Stage File oder alle mit Stage Changed in den Index legen
- Im unteren Textfeld eine Commit-Nachricht eingeben
- Klick auf Commit
- Optional direkt danach: Klick auf Push
7Push, Pull & Fetch
Der Unterschied im Überblick
| Befehl | Was passiert | Verändert Working Dir? |
|---|---|---|
| git fetch origin | Neue Commits vom Remote holen, in origin/* speichern | Nein sicher |
| git pull | fetch + merge: Commits holen und einpflegen | Ja |
| git pull --rebase | fetch + rebase: sauberere, lineare Historie | Ja |
| git push | Lokale Commits auf Remote hochladen | Nur Remote |
| git push -u origin branch | Branch erstmalig pushen und Tracking setzen | Nur Remote |
git fetch ist wie eine Vorschau – du lädst die Zeitung herunter, liest aber noch nicht darin. git pull ist fetch + merge in einem Schritt – der Alltags-Befehl.
Praktische Sync-Szenarien
# Täglich aktuell halten (einfachster Weg):
git pull
# Explizit: Remote-Stand ansehen, dann mergen:
git fetch origin
git log --oneline origin/main -5 # Was gibt's Neues?
git merge origin/main
# Du hast lokale Änderungen → erst stashen, dann pullen:
git stash
git pull
git stash pop
# Oder: erst committen, dann pullen:
git add . && git commit -m "WIP: zwischenstand"
git pull
| Aktion | Git GUI Menü |
|---|---|
| Neue Commits holen | Remote → Fetch from → origin |
| Fetch + Merge | Remote → Pull... |
| Eigene Commits hochladen | Remote → Push... oder Button Push |
8Branches
Ein Branch ist ein paralleler Entwicklungsstrang. Änderungen in einem Branch beeinflussen andere nicht – bis man sie zusammenführt.
Wann einen Branch anlegen?
- Neues Feature → eigener Branch, damit
mainstabil bleibt - Bugfix → isoliert, leicht revertierbar
- Experiment → ausprobieren ohne Risiko
- Teamarbeit → jeder hat seinen Branch, merged zurück
Branch-Befehle
| Befehl | Erklärung |
|---|---|
| git branch | Alle lokalen Branches anzeigen (* = aktueller) |
| git branch -a | Lokale + Remote-Branches anzeigen |
| git branch feature/xyz | Neuen Branch erstellen (noch nicht wechseln) |
| git checkout -b feature/xyz | Neuen Branch erstellen und direkt wechseln |
| git switch feature/xyz | Zu bestehendem Branch wechseln (moderne Syntax) |
| git checkout main | Zurück auf main wechseln |
| git branch -d feature/xyz | Branch löschen (nur wenn gemergt) |
| git branch -D feature/xyz | Branch erzwungen löschen Vorsicht |
| git branch -m alter-name neuer-name | Branch umbenennen |
Typischer Branch-Workflow
# 1. Auf aktuellem main starten:
git checkout main
git pull
# 2. Neuen Feature-Branch erstellen:
git checkout -b feature/benutzer-login
# 3. Arbeiten, committen...
git add . && git commit -m "feat: Login-Formular"
# 4. Branch zum Remote pushen:
git push -u origin feature/benutzer-login
# 5. Nach Review: zurück nach main und mergen:
git checkout main
git merge feature/benutzer-login
git push
# 6. Aufräumen:
git branch -d feature/benutzer-login
| Aktion | Git GUI Menü |
|---|---|
| Neuen Branch anlegen | Branch → Create... |
| Branch wechseln | Branch → Checkout... |
| Branch löschen | Branch → Delete... |
| Alle Branches grafisch anzeigen | Branch → Visualize All Branch History (öffnet gitk) |
9Merge & Konflikte
Merge – zwei Branches zusammenführen
# Stehe auf Branch A, pflege Branch B ein:
git checkout main
git merge feature/benutzer-login
# Remote-Stand direkt in aktuellen Branch mergen:
git merge origin/main
Was ist ein Merge-Konflikt?
Ein Konflikt entsteht, wenn zwei Personen dieselbe Zeile in derselben Datei geändert haben. Git kann nicht automatisch entscheiden, welche Version richtig ist – das entscheidest du.
Git sagt damit: „Zwei Versionen kollidieren – bitte entscheide." Das ist normaler Alltag.
So sieht ein Konflikt aus
<<<<<<< HEAD
DB_HOST = "localhost" # ← deine Version
=======
DB_HOST = "db-server-01" # ← eingehende Version (origin/main)
>>>>>>> origin/main
Konflikt lösen – Schritt für Schritt
Konflikte finden
git status # Zeigt alle Dateien mit "both modified"
Datei öffnen und Marker entfernen
In VS Code: Buttons Accept Current / Accept Incoming / Accept Both erscheinen über den Markern. Manuell: Marker <<<, ===, >>> und die nicht gewollte Version löschen.
Als gelöst markieren und Merge abschließen
git add datei.py # "gelöst" markieren
git commit # Merge-Commit erstellen
Merge abbrechen (falls zu komplex)
git merge --abort # Alles zurücksetzen wie vorher
| Aktion | Git GUI Menü |
|---|---|
| Branch einpflegen | Merge → Local Merge... → Branch auswählen |
| Merge abbrechen | Merge → Abort Merge |
| Konflikte anzeigen | Rote Dateien in Unstaged-Liste → Rechtsklick → Resolve Conflict |
10Stash – Arbeit schnell weglegen
Stash speichert alle nicht-committeten Änderungen in einem temporären Speicher und setzt das Working Directory auf einen sauberen Zustand zurück. Ideal, wenn du plötzlich den Branch wechseln oder pullen musst.
| Befehl | Erklärung |
|---|---|
| git stash | Alle Änderungen wegsichern (gestaged + ungestaged) |
| git stash -u | Auch untracked Dateien (neue, noch nicht git add-te) sichern |
| git stash push -m "beschreibung" | Stash mit Beschreibung speichern |
| git stash list | Alle gespeicherten Stashes anzeigen |
| git stash pop | Letzten Stash wiederherstellen und löschen |
| git stash apply | Stash wiederherstellen, aber nicht löschen |
| git stash drop | Letzten Stash löschen |
| git stash clear | Alle Stashes löschen |
Typischer Stash-Workflow
# Du arbeitest, musst aber kurz pullen:
git stash push -m "halbfertiger Login-Fix"
git pull
git stash pop
# Falls Konflikte entstehen: normal lösen (git add + git commit)
Neue Dateien (untracked) werden von git stash standardmäßig nicht gesichert. Mit git stash -u werden auch diese mitgespeichert.
11Befehlsreferenz
Alle wichtigen Befehle auf einen Blick. Für vollständige Dokumentation: git-scm.com/docs ↗
Projekt starten
| Befehl | Erklärung |
|---|---|
| git init [name] | Neues lokales Repository anlegen |
| git clone <url> | Remote-Repository vollständig herunterladen |
| git clone <url> ordner | In bestimmten Ordner clonen |
Status & Information
| Befehl | Erklärung |
|---|---|
| git status | Geänderte, neue und gestagten Dateien anzeigen |
| git log --oneline | Kompakte Commit-Liste |
| git log --oneline --graph --all | Grafische Darstellung aller Branches |
| git log -n 10 | Letzte 10 Commits anzeigen |
| git diff | Nicht-gestagten Änderungen anzeigen |
| git diff --staged | Gestagten Änderungen anzeigen |
| git diff HEAD | Alle Änderungen seit letztem Commit |
| git blame [datei] | Zeilenweiser Autor-Nachweis |
| git show [commit] | Details eines Commits |
| git reflog | Alle lokalen Aktionen (Sicherheitsnetz) |
Dateien verwalten
| Befehl | Erklärung |
|---|---|
| git add [datei] | Datei in die Staging Area legen |
| git add . | Alle Änderungen stagen |
| git add -p | Interaktiv einzelne Abschnitte stagen |
| git restore [datei] | Dateiänderungen verwerfen unwiderruflich |
| git restore --staged [datei] | Datei aus Staging entfernen |
| git rm [datei] | Datei löschen und Löschung stagen |
| git mv [alt] [neu] | Datei verschieben/umbenennen |
Commits
| Befehl | Erklärung |
|---|---|
| git commit -m "text" | Gestagten Stand committen |
| git commit -am "text" | Alle getrackte Änderungen direkt committen |
| git commit --amend | Letzten Commit korrigieren (Nachricht oder Inhalt) |
| git reset --soft HEAD~1 | Letzten Commit aufheben, Dateien bleiben gestaged |
| git reset --hard HEAD~1 | Letzten Commit + Änderungen löschen gefährlich |
| git revert [commit-sha] | Commit rückgängig machen (als neuer Commit) sicher |
Branches
| Befehl | Erklärung |
|---|---|
| git branch | Lokale Branches anzeigen |
| git branch -a | Lokale + Remote-Branches anzeigen |
| git branch [name] | Neuen Branch anlegen |
| git checkout -b [name] | Neuen Branch anlegen und wechseln |
| git checkout [branch] | Branch wechseln |
| git merge [branch] | Branch in aktuellen einpflegen |
| git merge --abort | Laufenden Merge abbrechen |
| git rebase [branch] | Commits auf Basis eines anderen Branches neu aufsetzen |
| git branch -d [name] | Branch löschen (nur wenn gemergt) |
| git tag [name] | Tag am aktuellen Commit setzen |
Remote / Synchronisation
| Befehl | Erklärung |
|---|---|
| git remote -v | Konfigurierte Remotes anzeigen |
| git remote add origin <url> | Remote hinzufügen |
| git fetch [remote] | Neue Commits holen, Working Dir unverändert |
| git fetch --prune | Gelöschte Remote-Branches lokal entfernen |
| git pull | Fetch + Merge |
| git pull --rebase | Fetch + Rebase (sauberere Historie) |
| git push | Lokale Commits hochladen |
| git push -u origin [branch] | Branch erstmalig pushen und Tracking setzen |
| git push --tags | Tags mitschieben |
Stash
| Befehl | Erklärung |
|---|---|
| git stash | Änderungen wegsichern |
| git stash -u | Auch untracked Dateien sichern |
| git stash push -m "msg" | Stash mit Beschreibung |
| git stash list | Alle Stashes anzeigen |
| git stash pop | Letzten Stash wiederherstellen + löschen |
| git stash apply | Stash wiederherstellen (nicht löschen) |
| git stash drop | Letzten Stash löschen |
Notfall-Befehle
| Befehl | Erklärung |
|---|---|
| git restore . | Alle Änderungen verwerfen unwiderruflich |
| git reset --soft HEAD~1 | Letzten Commit aufheben, Dateien behalten |
| git revert [sha] | Commit sicher rückgängig machen (neuer Commit) sicher |
| git reflog | Alle Aktionen der letzten Wochen – das ultimative Sicherheitsnetz |
| git checkout main | Aus "detached HEAD" entkommen |
12Git GUI – Die grafische Oberfläche
Die Git GUI wird zusammen mit Git for Windows installiert und ist besonders nützlich für Übersicht und Merge-Vorgänge. Starten: Rechtsklick im Projektordner → Git GUI Here.
Fensteraufbau
Menüübersicht
| Menü → Eintrag | Funktion | CLI-Äquivalent |
|---|---|---|
| File → Clone... | Repo herunterladen | git clone <url> |
| Edit → Options... | Name, E-Mail, Editor einstellen | git config --global |
| Branch → Create... | Neuen Branch anlegen | git checkout -b |
| Branch → Checkout... | Branch wechseln | git checkout |
| Branch → Visualize All Branch History | Grafische Commit-Historie (gitk) | git log --graph --all |
| Commit → Amend Last Commit | Letzten Commit korrigieren | git commit --amend |
| Merge → Local Merge... | Branch einpflegen | git merge <branch> |
| Merge → Abort Merge | Merge abbrechen | git merge --abort |
| Remote → Fetch from → origin | Neue Commits holen | git fetch origin |
| Remote → Pull... | Fetch + Merge | git pull |
| Remote → Push... | Commits hochladen | git push |
Schaltflächen im Hauptfenster
| Button | Funktion | CLI-Äquivalent |
|---|---|---|
| Rescan | Arbeitsverzeichnis neu einlesen | git status |
| Stage Changed | Alle geänderten Dateien stagen | git add . |
| Commit | Commit erstellen | git commit -m "..." |
| Push | Commits hochladen | git push |
Nutze die GUI für Überblick und Merge-Vorgänge – die Diff-Ansicht und Konfliktlösung sind grafisch sehr komfortabel. Für schnelle Alltagsbefehle (pull, status, stash) ist die Kommandozeile schneller.
13Häufige Fehler & Lösungen
„Your local changes would be overwritten by merge"
Git weigert sich zu pullen, weil uncommitted Änderungen vorhanden sind.
# Lösung A – Stash:
git stash
git pull
git stash pop
# Lösung B – erst committen:
git add . && git commit -m "WIP: zwischenstand"
git pull
„detached HEAD state"
Du bist auf einem einzelnen Commit gelandet, nicht auf einem Branch. Neue Commits gehen verloren!
# Sofort auf einen Branch wechseln:
git checkout main
# oder eigenen Branch retten:
git checkout -b rescue-branch # sichert die Commits
„fatal: not a git repository"
Du bist im falschen Verzeichnis.
cd C:\Projekte\mein-projekt
git status # jetzt sollte es funktionieren
„CONFLICT (content): Merge conflict in datei.py"
git status # alle Konflikte anzeigen
# Dateien manuell editieren (Marker entfernen)
git add datei.py # als gelöst markieren
git commit # Merge abschließen
Ich will den letzten Commit rückgängig machen!
# Commit aufheben, Dateien behalten (gestaged):
git reset --soft HEAD~1
# Commit sicher rückgängig als neuen Commit (empfohlen für gepushte Commits!):
git revert HEAD
Ich habe versehentlich mit --hard zurückgesetzt!
# reflog zeigt alle Aktionen der letzten Wochen:
git reflog
# Dann auf den gewünschten Stand zurück:
git checkout HEAD@{2}
Git lässt dich nie heimlich Daten verlieren. Wenn es sich weigert, erklärt es warum. Lies die Fehlermeldung genau – sie enthält meist den Lösungshinweis.