Artikel

Git-Grundlagen: Einführung in die Versionskontrolle und praktische Anwendung

Ein Einsteigerleitfaden zur Versionskontrolle mit Git: was Git ist, warum wir es nutzen, die wichtigsten Befehle, Vergleiche aus dem Alltag, typische Fehler, praktische Tipps und eine Kurzreferenz für den täglichen Workflow.

Furkan Özay25. Juni 2025 · 13 Min. Lesezeit
czCZAY.DEV // EDITORIALDE
WEB TEMELLERI

#Web Temelleri · 13 MIN LESEZEIT

FURKAN ÖZAYVOL. 2025 // #122D

1. Einführung und Motivation

Beim Programmieren oder bei der Arbeit an einem Projekt ist es entscheidend, Änderungen nachzuverfolgen und bei Bedarf zu einer früheren Version zurückzukehren. Genau dafür gibt es Git!

Erklärung: Vergleich aus dem Alltag

Git ist, als würdest du bei einem Word-Dokument nach jedem Schritt mit „Speichern unter“ ein Backup anlegen. Nur viel schlauer und automatisiert!

· · ·

2. Was ist Git und warum nutzen wir es?

Erklärung: Warum Git?

Git ist ein Versionskontrollsystem, das die Historie deiner Dateien und deines Codes Schritt für Schritt aufzeichnet. So kannst du sowohl deine eigenen Änderungen als auch die Beiträge deiner Teamkollegen sicher verwalten.

  • Rückgängig machen: Eine Änderung war ein Fehler? Mit Git stellst du frühere Zustände einfach wieder her.
  • Teamarbeit: Mehrere Personen können am selben Projekt arbeiten, ohne sich gegenseitig in die Quere zu kommen.
  • Ausprobieren und Sicherheit: Du kannst ein neues Feature testen, ohne die Hauptcodebasis zu zerstören.
· · ·

3. Git installieren und erste Einrichtung

  • Git herunterladen und für dein Betriebssystem installieren.
  • Prüfe die Installation anschließend mit git --version im Terminal.
  • Lege deinen Benutzernamen und deine E-Mail-Adresse fest:
    Bash
    git config --global user.name "Adınız Soyadınız"
    git config --global user.email "[email protected]"
· · ·

4. Grundbegriffe: Commit, Branch, Staging, HEAD, DAG

Erklärung: Wie funktioniert Git?

Git macht bei jeder Änderung einen „Snapshot“ deiner Dateien. Diese Snapshots heißen Commits und sind wie eine Kette miteinander verbunden. Diese Kette bildet die Historie deines Projekts.

  • Staging Area (Index): Der Bereich, in dem du deine Änderungen vorbereitest, bevor du sie committest.
  • Commit: Eine Aufzeichnung des Projektzustands zu einem bestimmten Zeitpunkt.
  • Branch: Ermöglicht dir, verschiedene Entwicklungslinien zu eröffnen. Der Hauptbranch heißt meist main oder master.
  • HEAD: Zeigt auf den Branch, an dem du gerade arbeitest.
  • DAG (Directed Acyclic Graph): Commits sind in einer gerichteten, zyklenfreien Graphstruktur miteinander verknüpft.

Erklärung: Vergleich aus dem Alltag

Die Staging Area ist wie dein Einkaufswagen. Was im Wagen liegt, wird committet; was du weglässt, bleibt im Regal.

· · ·

5. Grundlegende Git-Befehle: die ersten Schritte

Ein neues Git-Repository erstellen

Bash
git init

Verwandelt deinen aktuellen Ordner in ein Git-Projekt.

Änderungen verfolgen

Bash
git status

Zeigt geänderte Dateien in deinem Arbeitsverzeichnis und bereits gestagte Dateien an.

Dateien hinzufügen (Staging)

Bash
git add dosya.txt

Fügt eine bestimmte Datei hinzu. Für alle Dateien:

Bash
git add .

Änderungen speichern (Commit)

Bash
git commit -m "Açıklama yazın"

Hält deine Änderungen dauerhaft fest.

Historie ansehen

Bash
git log

Listet die komplette Commit-Historie auf.

· · ·

6. Branches und Branching-Strategien

  • Hauptbranch (main/master): Immer produktionsreifer, stabiler Code.
  • Feature Branch: Wird für neue Features erstellt und nach Fertigstellung in den Hauptbranch gemergt.
  • Hotfix-/Release-Branch: Für dringende Bugfixes oder die Release-Vorbereitung.

Erklärung: Warum Branches nutzen?

Um mehrere Features oder Fixes gleichzeitig zu entwickeln, ohne sich gegenseitig zu stören.

Beliebte Branching-Strategien

  • Git Flow: Nutzt die Branches main, develop, feature, release und hotfix für komplexe Projekte.
  • GitHub Flow: Ein einfacher Workflow rund um den main-Branch und kurzlebige Feature Branches.
· · ·

7. Mit Remote-Repositories und GitHub arbeiten

  • Remote-Repository (Remote): Eine Kopie, die auf Plattformen wie GitHub oder GitLab liegt.
  • Ein Remote-Repository hinzufügen:
    Bash
    git remote add origin <repo-adresi>
    git push -u origin main
  • Die neuesten Änderungen aus einem Remote-Repository holen:
    Bash
    git pull
  • Ein bestehendes Projekt auf deinen Rechner klonen:
    Bash
    git clone <repo-adresi>
· · ·

8. Weitere häufig genutzte Befehle

  • git branch: Listet die vorhandenen Branches auf.
  • git checkout -b yeni-ozellik: Erstellt einen neuen Branch und wechselt zu ihm.
  • git merge <dal>: Merged den angegebenen Branch in den aktuellen Branch.
· · ·

9. Merge vs. Rebase, Konflikte und Lösungen

Wie entsteht ein Merge-Konflikt? (Szenario und Beispiel)

Szenario: Zwei Personen ändern dieselbe Zeile einer Datei auf unterschiedliche Weise.

  1. Auf dem main-Branch existiert eine Datei:
    txt
    mesaj.txt:
    Merhaba dünya!
  2. Auf dem Branch feature-a wird diese Zeile geändert:
    txt
    mesaj.txt:
    Merhaba Copilot!
  3. Auf dem Branch feature-b wird dieselbe Zeile anders geändert:
    txt
    mesaj.txt:
    Merhaba insan!
  4. Zuerst wird feature-a in den main-Branch gemergt. Dann wird versucht, feature-b in main zu mergen. Da es zwei widersprüchliche Änderungen in derselben Zeile gibt, löst Git einen Merge-Konflikt aus.

Erklärung: Vergleich aus dem Alltag

Wenn zwei Personen in einem Word-Dokument denselben Satz unterschiedlich bearbeiten, muss jemand entscheiden, welche Version stimmt. Git bittet dich, diese Entscheidung zu treffen.

· · ·

Merge-/Rebase-Befehle und Konflikte lösen

Merge

Bash
git merge feature-branch

Führt zwei Branches zusammen. Die vollständige Commit-Historie bleibt erhalten.

Rebase

Bash
git rebase main

Verschiebt deinen Branch an die Spitze des main-Branches und sorgt so für eine sauberere, lineare Historie.

Merge-/Rebase-Konflikte

  • Bei einem Konflikt erscheinen in der Datei die Markierungen <<<<<<<, ======= und >>>>>>>.
  • Löse die betroffenen Zeilen manuell und führe dann aus:
    Bash
    git add <dosya>
    git commit
  • Einen Commit kannst du erst abschließen, wenn die Konflikte gelöst sind.

Warnung: Häufiger Fehler

Wenn du git add . und git commit ausführst, ohne die Konfliktmarkierungen aufzulösen, kann kaputter Code im Hauptbranch landen.

· · ·

10. Häufige Fehler und wie du sie behebst (im Detail)

1. Auf dem falschen Branch committet

Szenario: Du dachtest, du arbeitest auf einem Feature Branch, hast aber direkt auf main committet (oder umgekehrt).

Lösung:

  1. Den Hash des Commits finden:
    Bash
    git log --oneline
  2. Zum Ziel-Branch wechseln:
    Bash
    git checkout main
  3. Den Commit auf den main-Branch anwenden:
    Bash
    git cherry-pick <commit-hash>
  4. Den Commit vom falschen Branch entfernen:
    Bash
    git checkout feature
    git reset --hard HEAD~1

Tipp: Profi-Tipp

Mit git cherry-pick kannst du jeden beliebigen Commit herauspicken und auf einen anderen Branch anwenden.

· · ·

2. Versehentlich einen Commit gelöscht

Szenario: Bei einem git reset --hard oder einem Rebase ist ein Commit verloren gegangen.

Lösung:

  1. Den Commit-Hash finden:
    Bash
    git reflog
  2. Den verlorenen Commit in einem neuen Branch wiederherstellen:
    Bash
    git checkout -b kurtarma <commit-hash>

Tipp: Debugging-Tipp

git reflog protokolliert fast jede Aktion, die du in deinem lokalen Repository ausführst. Keine Panik – die meisten verlorenen Commits lassen sich wiederherstellen!

· · ·

3. Fehlender Commit nach Merge oder Rebase

Szenario: Nach einem Merge oder Rebase sind einige Commits verschwunden.

Lösung:

  1. Finde den Commit-Hash mit git reflog.
  2. Stelle den Commit wieder her, indem du einen neuen Branch erstellst:
    Bash
    git branch kayip-commit <commit-hash>
  3. Bei Bedarf kannst du ihn anschließend in deinen Ziel-Branch mergen oder per Cherry-pick übernehmen.
· · ·

4. Versehentlich eine Datei gelöscht

Szenario: Du hast eine Datei gelöscht und willst sie vor dem Commit wiederherstellen.

Lösung:

  • Um sie auf den Stand des letzten Commits zurückzusetzen:
    Bash
    git checkout HEAD -- dosya.txt
  • Um sie aus einem älteren Commit wiederherzustellen:
    Bash
    git checkout <commit-hash> -- dosya.txt
· · ·

5. Merge-Konflikt lässt sich nicht lösen

Szenario: Du hast versehentlich Konfliktmarkierungen (<<<<<<<, =======, >>>>>>>) gelöscht und die Datei beschädigt.

Lösung:

  • Um die Datei zurückzusetzen und den Konflikt von vorn zu lösen:
    Bash
    git checkout --ours dosya.txt   # Keeps your changes
    git checkout --theirs dosya.txt # Keeps incoming changes
  • Danach kannst du den Merge-Vorgang erneut durchführen.

Hinweis: Motivation

In Git passieren ständig Fehler. Wichtig ist, nicht in Panik zu geraten und Schritt für Schritt vorzugehen. Mach git status, git log und git reflog zu deinen besten Freunden!

· · ·

Häufige Fehler und Wiederherstellung (Übersichtstabelle)

FehlerWiederherstellung
Auf dem falschen Branch committetgit cherry-pick, git reset
Commit gelöschtgit reflog, neuer Branch
Commit fehlt nach Merge/Rebasegit reflog, git branch
Datei versehentlich gelöschtgit checkout
Merge-Konflikt nicht lösbargit checkout --ours/theirs
· · ·

11. Praxisszenarien und Zusammenarbeit im Team

  • Fork und PR: Das Projekt eines anderen forken und deine Änderungen als Pull Request einreichen.
  • Upstream-Sync: Aktualisierungen aus dem Original-Repository holen, um deinen Fork aktuell zu halten.
  • Code Review: Codeänderungen vor dem Merge über PRs prüfen.

Tipp: Profi-Tipp

Entwickle im Team jedes Feature in einem eigenen Branch und merge es per PR in den Hauptbranch.

· · ·

12. Fortgeschrittene Themen

Squash

Szenario: Du hast auf einem Feature Branch 5 kleine Commits gemacht, willst sie aber als einen einzigen Commit in den Hauptbranch mergen.

Ausführliches Beispiel:

  1. Der Branch feature/login enthält die folgenden Commits:
    • feat: kullanıcı adı inputu eklendi
    • fix: input typo düzeltildi
    • feat: şifre inputu eklendi
    • fix: şifre inputu typo düzeltildi
    • style: inputlara margin eklendi
  2. Vor dem Merge in main willst du sie zu einem Commit zusammenfassen:
    Bash
    git checkout feature/login
    git rebase -i HEAD~5
  3. Setze im interaktiven Editor den ersten Commit auf pick und alle übrigen auf squash. Bearbeite die Commit-Nachricht und speichere.
  4. Ergebnis: Alle Änderungen sind in einem einzigen Commit zusammengefasst. Jetzt kannst du in main mergen.

Tipp

Squashing hält die Commit-Historie sauber und lesbar.

· · ·

Cherry-pick

Szenario: Du willst einen bestimmten Commit aus einem anderen Branch herauspicken und auf deinen aktuellen Branch anwenden.

Ausführliches Beispiel:

  1. Auf hotfix/bugfix wurde ein dringender Fix committet:
    • fix: login bug düzeltildi (Commit-Hash: a1b2c3d)
  2. Du arbeitest auf feature/profile und willst diesen Fix übernehmen:
    Bash
    git checkout feature/profile
    git cherry-pick a1b2c3d
  3. Ergebnis: Nur dieser eine Commit wird auf deinen aktuellen Branch angewendet. Dein Code ist aktualisiert.

Tipp

Extrem nützlich, wenn du einen dringenden Fix auf verschiedene Branches übertragen musst.

· · ·

Revert

Szenario: Du hast auf dem main-Branch einen fehlerhaften Commit erstellt, willst aber die Historie nicht umschreiben.

Ausführliches Beispiel:

  1. Auf main wurde versehentlich eine Datei gelöscht:
    • commit hash: d4e5f6g
  2. Um diesen Commit rückgängig zu machen:
    Bash
    git checkout main
    git revert d4e5f6g
  3. Ergebnis: Die gelöschte Datei ist wiederhergestellt, und ein neuer Revert-Commit wird erstellt.

Tipp

Revert macht fehlerhafte Änderungen sicher rückgängig, ohne die bestehende Historie zu verändern.

· · ·

Reset

Szenario: Du hast 3 unnötige Commits gemacht und willst sie komplett entfernen.

Ausführliches Beispiel:

  1. Letzte Commits:
    • fix: typo
    • test: test kodu
    • debug: console.log eklendi
  2. Um die letzten 3 Commits zu löschen:
    Bash
    git reset --hard HEAD~3
  3. Ergebnis: Das Repository springt auf den Stand von vor 3 Commits zurück. Diese Commits und Änderungen werden vollständig verworfen.

Warnung

reset --hard ist destruktiv und lässt sich nicht einfach rückgängig machen. Verwende es niemals auf gemeinsam genutzten, öffentlichen Branches!

· · ·

Reflog

Szenario: Du hast versehentlich einen Branch oder Commit gelöscht und willst ihn wiederherstellen.

Ausführliches Beispiel:

  1. Nach einem git reset --hard ist ein Commit verschwunden.
  2. So findest du den fehlenden Commit:
    Bash
    git reflog
    # Find the old commit hash in the output (e.g. 9z8y7x6)
    git checkout -b kurtarma 9z8y7x6
  3. Ergebnis: Der verlorene Commit ist in einem neuen Branch wiederhergestellt.

Tipp

Reflog protokolliert fast jede Aktion, die du in Git ausführst. Keine Panik!

· · ·

Stash

Szenario: Du musst mitten in der Arbeit dringend den Branch wechseln, willst aber unfertige Arbeit nicht committen.

Ausführliches Beispiel:

  1. Du bist auf feature/search und hast uncommittete Änderungen.
  2. Du musst zum main-Branch wechseln:
    Bash
    git stash
    git checkout main
    # Once done, switch back to your feature branch
    git checkout feature/search
    git stash pop
  3. Ergebnis: Deine Änderungen werden sicher wiederhergestellt, ohne dass Arbeit verloren geht.

Tipp

Stash ist ideal, um den Branch zu wechseln, ohne unfertige Arbeit zu committen.

· · ·

.gitignore und .gitattributes

Szenario: Dein Projekt enthält Dateien, die nicht verfolgt werden sollen, etwa Build-Ausgaben oder geheime Schlüssel.

Ausführliches Beispiel:

  1. Du hast Ordner/Dateien wie node_modules/, .env oder dist/.
  2. Trage sie in deine .gitignore-Datei ein:
    txt
    node_modules/
    .env
    dist/
  3. Ergebnis: Git ignoriert diese Dateien.
  4. Nutze .gitattributes für Zeilenende-Konfigurationen, zum Beispiel:
    txt
    * text=auto

Tipp

.gitignore verhindert, dass unnötige oder sensible Dateien in dein Repository gelangen.

· · ·

Hooks

Szenario: Du willst vor jedem Commit automatisierte Tests ausführen.

Ausführliches Beispiel:

  1. Öffne oder erstelle .git/hooks/pre-commit.
  2. Füge das folgende Skript ein:
    Bash
    #!/bin/sh
    npm test
  3. Mach die Datei ausführbar:
    Bash
    chmod +x .git/hooks/pre-commit
  4. Ergebnis: Vor jedem Commit laufen die automatisierten Tests; schlagen sie fehl, wird der Commit abgebrochen.

Tipp

Hooks helfen dir, die Codequalität in deinem Repository automatisch durchzusetzen.

· · ·

Submodules

Szenario: Du willst ein anderes Git-Repository (z. B. eine gemeinsame Bibliothek) als Submodule in dein Projekt einbinden.

Ausführliches Beispiel:

  1. So fügst du eine gemeinsame Bibliothek hinzu:
    Bash
    git submodule add https://github.com/ornek/ortak-kutuphane.git libs/ortak-kutuphane
  2. So aktualisierst du das Submodule:
    Bash
    git submodule update --remote
  3. Ergebnis: Das Submodule ist in dein Projekt eingebettet und bleibt aktuell.

Tipp

Submodules eignen sich ideal, um gemeinsamen Code über mehrere Repositories hinweg zu teilen.

· · ·

Shallow Clone & LFS

Szenario 1: Ein Repository ist sehr groß, und du willst nur schnell den neuesten Snapshot herunterladen.

Ausführliches Beispiel:

  1. So klonst du nur den neuesten Commit:
    Bash
    git clone --depth=1 https://github.com/ornek/buyuk-repo.git
  2. Ergebnis: Es wird nur die neueste Revision heruntergeladen statt der gesamten Historie.

Szenario 2: Dein Repository enthält große Dateien (z. B. Videos, Datensätze), die Git ausbremsen.

Ausführliches Beispiel:

  1. Git LFS einrichten:
    Bash
    git lfs install
    git lfs track "*.mp4"
    git add .gitattributes
    git add video.mp4
    git commit -m "LFS ile video eklendi"
  2. Ergebnis: Große Dateien werden von LFS verwaltet, und dein Haupt-Repository bleibt schnell.

Tipp

LFS verbessert die Performance in Projekten, die große Binärdateien verarbeiten.

· · ·

13. FAQ und Ressourcen

Häufig gestellte Fragen

Hinweis: Fortgeschrittene Fragen zu Git

F: Wie halte ich meine Commit-Historie sauber? A: Wenn du Rebase und Squash auf Feature Branches einsetzt, besonders in der Teamarbeit, bleibt die Historie knapp und lesbar.

F: Merge oder Rebase? A: Nutze Merge, um auf Team-Branches den gemeinsamen Kontext zu erhalten, und Rebase auf Feature Branches, um die lokale Historie sauber zu halten.

F: Kann man einen Commit komplett löschen? A: Du kannst die Historie mit git rebase -i bearbeiten oder Commits mit git reset --hard löschen. Mit Vorsicht verwenden!

F: Wie verwalte ich große Dateien? A: Du kannst große Dateien mit Git LFS verfolgen.

F: Wie aktualisiere ich Submodules? A: Nutze den Befehl git submodule update --remote.

· · ·

Ressourcen und weiterführende Literatur

Hinweis

Jetzt bist du bereit, Git nicht nur auf Einsteigerniveau, sondern wie ein Profi einzusetzen!

Interaktive Roadmap & Tool

Als Nächstes lesen