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

BegriffBedeutung
Repository (Repo)Der Projektordner inklusive der gesamten Änderungshistorie (im .git-Unterordner)
CommitEin gespeicherter Schnappschuss – wie ein Spielstand. Unveränderlich, mit ID (SHA).
BranchEin paralleler Entwicklungsstrang. main ist typischerweise der stabile Stand.
RemoteDas zentrale, serverseitige Repository (z.B. GitHub, GitLab, internes Git-Server)
HEADZeiger auf den aktuellen Commit – den Stand, den du gerade siehst
Staging Area / IndexZwischenspeicher für Änderungen, die beim nächsten Commit gespeichert werden
CloneKomplette Kopie eines Remote-Repos auf den lokalen Rechner
FetchNeue Commits vom Remote holen – Working Directory bleibt unverändert
PullFetch + Merge in einem Schritt: aktuell halten
PushLokale Commits auf das Remote hochladen
MergeZwei 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:

Working Directory Deine Dateien, wie du sie siehst git status / diff git add git restore Staging Area Vorgemerkter Stand für nächsten Commit git diff --staged git commit git reset Local Repository Alle Commits, die gesamte Historie git log git push git fetch/pull Remote GitHub, GitLab internes Git origin/main

Jede Dateiänderung durchläuft diese vier Stationen

Merksatz

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
Wichtig

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
  1. Git GUI öffnen → File → Clone...
  2. Source Location: URL des Remote-Repos eingeben
  3. Target Directory: Lokalen Zielordner wählen
  4. Klick auf Clone
Faustregel

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/:

NameBedeutung
origin/mainDer Zustand von main auf dem Server – so wie Git ihn zuletzt gesehen hat (beim letzten fetch/pull)
origin/feature/loginEin Feature-Branch, der auf dem Server existiert – egal ob du lokal schon damit gearbeitet hast
origin/HEADZeiger auf den Standard-Branch des Remotes (meist main)
Wichtig zu verstehen

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 → origin tauchen 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
Tracking

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.

  1. Remote → Fetch from → origin ausführen
  2. Branch → Checkout... – in der Liste erscheinen jetzt auch Remote-Branches unter remotes/origin/...
  3. 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 verwendenWann NICHT fetch genug ist
Du willst zuerst sehen, was auf dem Server passiert ist, bevor du integrierstWenn du einfach nur aktuell bleiben willst → dann direkt git pull
Du hast lokale Änderungen und willst keine Überraschungen beim MergeWenn 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?
fetch --prune

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.

SzenarioWas passiertErgebnis
Du bist auf main, Server hat 3 neue Commits, du hast keine lokalenFast-Forward: dein main-Zeiger wird einfach vorgerücktSauber, kein Merge-Commit
Du bist auf main, beide Seiten haben neue CommitsEin Merge-Commit wird erstelltMerge-Commit in der Historie
Du hast uncommitted ÄnderungenGit verweigert den PullFehlermeldung → 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
Wann --rebase verwenden?

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 nichtWarum nichtMach stattdessen
git pull mit uncommitted ÄnderungenGit verweigert es oder erzeugt unerwünschte Merge-Commitsgit stashgit pullgit stash pop
Direkt auf main committen (im Team)main ist der stabile Stand – direkte Commits riskieren Destabilisierung für alleEigenen Feature-Branch anlegen, dort arbeiten, dann mergen
git push --force auf main oder shared BranchesÜberschreibt die History anderer – Commits können unwiederbringlich verloren gehenNur auf deinem eigenen, nicht geteilten Branch – oder gar nicht
Tagelang lokal arbeiten ohne fetchDu weißt nicht, was sich auf dem Server geändert hat – große Konflikte beim nächsten MergeTäglich (morgens) git fetch oder git pull
git fetch statt git pull verwechselnNach git fetch sind deine lokalen Dateien noch alt – du arbeitest auf veraltetem StandNach git fetch noch git merge origin/main ausführen
Einen Remote-Branch direkt auschecken ohne fetchDu siehst möglicherweise einen veralteten StandImmer erst git fetch, dann auschecken
Commits auf einem fremden Feature-Branch pushen ohne AbspracheDein Kollege hat diesen Branch gerade in Arbeit – du erzeugst ihm KonflikteErst 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.

1

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
2

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
3

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"
4

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 der Praxis

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

#AktionCLIGit GUI
1Server-Stand holengit fetch originRemote → Fetch from → origin
2Was ist neu?git log --oneline origin/main ^HEADBranch → Visualize All Branch History
3main einpflegengit merge origin/mainMerge → Local Merge → origin/main
4Arbeiten
5Stagen & Committengit add . && git commit -m "..."Rescan → Stage → Commit-Nachricht → Commit
6Eigene Commits pushengit pushRemote → Push oder Button Push

5Status & Diff

Die wichtigsten Befehle zum Nachschauen, bevor man handelt.

BefehlWas es zeigtWann?
git statusAlle geänderten, neuen und gestagten DateienJederzeit – 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 HEADAlle Änderungen seit letztem Commit (gestaged + ungestaged)Überblick
git diff commit1 commit2Unterschied zwischen zwei CommitsVergleich
git log --onelineKompakte Commit-Liste (ID + Nachricht)Verlauf ansehen
git log --oneline --graphGrafische Branch-Darstellung im TerminalBranch-Überblick
git blame [datei]Wer hat welche Zeile wann geändert?Ursachenforschung
git show [commit]Details eines bestimmten CommitsCommit 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

BefehlErklärung
git add datei.pyEinzelne Datei in den Index legen
git add .Alle geänderten Dateien im aktuellen Ordner stagen
git add src/Ganzen Unterordner stagen
git add -pInteraktiv: einzelne Abschnitte (hunks) auswählen – sehr nützlich!
git restore --staged datei.pyDatei 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
Gute Commit-Nachrichten

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"
  1. Klick auf Rescan
  2. Dateien einzeln anklicken und mit Stage File oder alle mit Stage Changed in den Index legen
  3. Im unteren Textfeld eine Commit-Nachricht eingeben
  4. Klick auf Commit
  5. Optional direkt danach: Klick auf Push

7Push, Pull & Fetch

Der Unterschied im Überblick

BefehlWas passiertVerändert Working Dir?
git fetch originNeue Commits vom Remote holen, in origin/* speichernNein sicher
git pullfetch + merge: Commits holen und einpflegenJa
git pull --rebasefetch + rebase: sauberere, lineare HistorieJa
git pushLokale Commits auf Remote hochladenNur Remote
git push -u origin branchBranch erstmalig pushen und Tracking setzenNur Remote
fetch vs. pull

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
AktionGit GUI Menü
Neue Commits holenRemote → Fetch from → origin
Fetch + MergeRemote → Pull...
Eigene Commits hochladenRemote → 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?

Branch-Befehle

BefehlErklärung
git branchAlle lokalen Branches anzeigen (* = aktueller)
git branch -aLokale + Remote-Branches anzeigen
git branch feature/xyzNeuen Branch erstellen (noch nicht wechseln)
git checkout -b feature/xyzNeuen Branch erstellen und direkt wechseln
git switch feature/xyzZu bestehendem Branch wechseln (moderne Syntax)
git checkout mainZurück auf main wechseln
git branch -d feature/xyzBranch löschen (nur wenn gemergt)
git branch -D feature/xyzBranch erzwungen löschen Vorsicht
git branch -m alter-name neuer-nameBranch 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
AktionGit GUI Menü
Neuen Branch anlegenBranch → Create...
Branch wechselnBranch → Checkout...
Branch löschenBranch → Delete...
Alle Branches grafisch anzeigenBranch → 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.

Konflikte sind kein Fehler

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

1

Konflikte finden

git status   # Zeigt alle Dateien mit "both modified"
2

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.

3

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
AktionGit GUI Menü
Branch einpflegenMerge → Local Merge... → Branch auswählen
Merge abbrechenMerge → Abort Merge
Konflikte anzeigenRote 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.

BefehlErklärung
git stashAlle Änderungen wegsichern (gestaged + ungestaged)
git stash -uAuch untracked Dateien (neue, noch nicht git add-te) sichern
git stash push -m "beschreibung"Stash mit Beschreibung speichern
git stash listAlle gespeicherten Stashes anzeigen
git stash popLetzten Stash wiederherstellen und löschen
git stash applyStash wiederherstellen, aber nicht löschen
git stash dropLetzten Stash löschen
git stash clearAlle 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)
Hinweis

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

BefehlErklärung
git init [name]Neues lokales Repository anlegen
git clone <url>Remote-Repository vollständig herunterladen
git clone <url> ordnerIn bestimmten Ordner clonen

Status & Information

BefehlErklärung
git statusGeänderte, neue und gestagten Dateien anzeigen
git log --onelineKompakte Commit-Liste
git log --oneline --graph --allGrafische Darstellung aller Branches
git log -n 10Letzte 10 Commits anzeigen
git diffNicht-gestagten Änderungen anzeigen
git diff --stagedGestagten Änderungen anzeigen
git diff HEADAlle Änderungen seit letztem Commit
git blame [datei]Zeilenweiser Autor-Nachweis
git show [commit]Details eines Commits
git reflogAlle lokalen Aktionen (Sicherheitsnetz)

Dateien verwalten

BefehlErklärung
git add [datei]Datei in die Staging Area legen
git add .Alle Änderungen stagen
git add -pInteraktiv 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

BefehlErklärung
git commit -m "text"Gestagten Stand committen
git commit -am "text"Alle getrackte Änderungen direkt committen
git commit --amendLetzten Commit korrigieren (Nachricht oder Inhalt)
git reset --soft HEAD~1Letzten Commit aufheben, Dateien bleiben gestaged
git reset --hard HEAD~1Letzten Commit + Änderungen löschen gefährlich
git revert [commit-sha]Commit rückgängig machen (als neuer Commit) sicher

Branches

BefehlErklärung
git branchLokale Branches anzeigen
git branch -aLokale + 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 --abortLaufenden 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

BefehlErklärung
git remote -vKonfigurierte Remotes anzeigen
git remote add origin <url>Remote hinzufügen
git fetch [remote]Neue Commits holen, Working Dir unverändert
git fetch --pruneGelöschte Remote-Branches lokal entfernen
git pullFetch + Merge
git pull --rebaseFetch + Rebase (sauberere Historie)
git pushLokale Commits hochladen
git push -u origin [branch]Branch erstmalig pushen und Tracking setzen
git push --tagsTags mitschieben

Stash

BefehlErklärung
git stashÄnderungen wegsichern
git stash -uAuch untracked Dateien sichern
git stash push -m "msg"Stash mit Beschreibung
git stash listAlle Stashes anzeigen
git stash popLetzten Stash wiederherstellen + löschen
git stash applyStash wiederherstellen (nicht löschen)
git stash dropLetzten Stash löschen

Notfall-Befehle

BefehlErklärung
git restore .Alle Änderungen verwerfen unwiderruflich
git reset --soft HEAD~1Letzten Commit aufheben, Dateien behalten
git revert [sha]Commit sicher rückgängig machen (neuer Commit) sicher
git reflogAlle Aktionen der letzten Wochen – das ultimative Sicherheitsnetz
git checkout mainAus "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

File Edit Branch Commit Merge Remote Help UNSTAGED CHANGES ● config/local.cfg (geändert, noch nicht gestaged) STAGED CHANGES ✓ src/login.py (gestaged – kommt in Commit) DIFF-ANSICHT + DB_HOST = "localhost" - DB_HOST = "db-server-01" grün = hinzugefügt | rot = entfernt Commit-Nachricht: feat: Login angepasst Commit Push Stage Changed Rescan

Menüübersicht

Menü → EintragFunktionCLI-Äquivalent
File → Clone...Repo herunterladengit clone <url>
Edit → Options...Name, E-Mail, Editor einstellengit config --global
Branch → Create...Neuen Branch anlegengit checkout -b
Branch → Checkout...Branch wechselngit checkout
Branch → Visualize All Branch HistoryGrafische Commit-Historie (gitk)git log --graph --all
Commit → Amend Last CommitLetzten Commit korrigierengit commit --amend
Merge → Local Merge...Branch einpflegengit merge <branch>
Merge → Abort MergeMerge abbrechengit merge --abort
Remote → Fetch from → originNeue Commits holengit fetch origin
Remote → Pull...Fetch + Mergegit pull
Remote → Push...Commits hochladengit push

Schaltflächen im Hauptfenster

ButtonFunktionCLI-Äquivalent
RescanArbeitsverzeichnis neu einlesengit status
Stage ChangedAlle geänderten Dateien stagengit add .
CommitCommit erstellengit commit -m "..."
PushCommits hochladengit push
Empfehlung

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}
Merksatz

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.