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 --versionim 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
mainodermaster. - 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
git initVerwandelt deinen aktuellen Ordner in ein Git-Projekt.
Änderungen verfolgen
git statusZeigt geänderte Dateien in deinem Arbeitsverzeichnis und bereits gestagte Dateien an.
Dateien hinzufügen (Staging)
git add dosya.txtFügt eine bestimmte Datei hinzu. Für alle Dateien:
git add .Änderungen speichern (Commit)
git commit -m "Açıklama yazın"Hält deine Änderungen dauerhaft fest.
Historie ansehen
git logListet 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.
- Auf dem main-Branch existiert eine Datei:
txt
mesaj.txt: Merhaba dünya! - Auf dem Branch
feature-awird diese Zeile geändert:txtmesaj.txt: Merhaba Copilot! - Auf dem Branch
feature-bwird dieselbe Zeile anders geändert:txtmesaj.txt: Merhaba insan! - Zuerst wird
feature-ain den main-Branch gemergt. Dann wird versucht,feature-bin 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
git merge feature-branchFührt zwei Branches zusammen. Die vollständige Commit-Historie bleibt erhalten.
Rebase
git rebase mainVerschiebt 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:
- Den Hash des Commits finden:
Bash
git log --oneline - Zum Ziel-Branch wechseln:
Bash
git checkout main - Den Commit auf den main-Branch anwenden:
Bash
git cherry-pick <commit-hash> - 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:
- Den Commit-Hash finden:
Bash
git reflog - 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:
- Finde den Commit-Hash mit
git reflog. - Stelle den Commit wieder her, indem du einen neuen Branch erstellst:
Bash
git branch kayip-commit <commit-hash> - 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)
| Fehler | Wiederherstellung |
|---|---|
| Auf dem falschen Branch committet | git cherry-pick, git reset |
| Commit gelöscht | git reflog, neuer Branch |
| Commit fehlt nach Merge/Rebase | git reflog, git branch |
| Datei versehentlich gelöscht | git checkout |
| Merge-Konflikt nicht lösbar | git 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:
- Der Branch
feature/loginenthält die folgenden Commits:feat: kullanıcı adı inputu eklendifix: input typo düzeltildifeat: şifre inputu eklendifix: şifre inputu typo düzeltildistyle: inputlara margin eklendi
- Vor dem Merge in
mainwillst du sie zu einem Commit zusammenfassen:Bashgit checkout feature/login git rebase -i HEAD~5 - Setze im interaktiven Editor den ersten Commit auf
pickund alle übrigen aufsquash. Bearbeite die Commit-Nachricht und speichere. - Ergebnis: Alle Änderungen sind in einem einzigen Commit zusammengefasst. Jetzt kannst du in
mainmergen.
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:
- Auf
hotfix/bugfixwurde ein dringender Fix committet:fix: login bug düzeltildi(Commit-Hash:a1b2c3d)
- Du arbeitest auf
feature/profileund willst diesen Fix übernehmen:Bashgit checkout feature/profile git cherry-pick a1b2c3d - 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:
- Auf
mainwurde versehentlich eine Datei gelöscht:commit hash: d4e5f6g
- Um diesen Commit rückgängig zu machen:
Bash
git checkout main git revert d4e5f6g - 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:
- Letzte Commits:
fix: typotest: test kodudebug: console.log eklendi
- Um die letzten 3 Commits zu löschen:
Bash
git reset --hard HEAD~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:
- Nach einem
git reset --hardist ein Commit verschwunden. - 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 - 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:
- Du bist auf
feature/searchund hast uncommittete Änderungen. - 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 - 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:
- Du hast Ordner/Dateien wie
node_modules/,.envoderdist/. - Trage sie in deine
.gitignore-Datei ein:txtnode_modules/ .env dist/ - Ergebnis: Git ignoriert diese Dateien.
- Nutze
.gitattributesfü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:
- Öffne oder erstelle
.git/hooks/pre-commit. - Füge das folgende Skript ein:
Bash
#!/bin/sh npm test - Mach die Datei ausführbar:
Bash
chmod +x .git/hooks/pre-commit - 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:
- So fügst du eine gemeinsame Bibliothek hinzu:
Bash
git submodule add https://github.com/ornek/ortak-kutuphane.git libs/ortak-kutuphane - So aktualisierst du das Submodule:
Bash
git submodule update --remote - 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:
- So klonst du nur den neuesten Commit:
Bash
git clone --depth=1 https://github.com/ornek/buyuk-repo.git - 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:
- 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" - 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
Junior Frontend Developer 2026
Was du wirklich wissen musst, um 2026 einen Junior-Frontend-Job zu bekommen, und was warten kann – abgeleitet aus echten Stellenanzeigen.
SQL oder NoSQL?
Beantworte sechs Fragen, und ich sage dir, welche Art von Datenbank zu deinem Projekt passt und warum.