Git Rebase Vs Merge
Git Rebase vs. Merge: Die richtige Wahl
Merge und Rebase führen Branches zusammen – aber unterschiedlich. Lernen Sie, wann Sie welche Strategie verwenden sollten.
Der Unterschied
# Ausgangssituation
A---B---C feature
/
D---E---F---G main
# Nach MERGE
A---B---C
/ \
D---E---F---G---M main (M = Merge-Commit)
# Nach REBASE
A'--B'--C' feature (neu geschrieben)
/
D---E---F---G main
Vergleich
| Aspekt | Merge | Rebase |
|---|---|---|
| History | Verzweigt (echt) | Linear (umgeschrieben) |
| Commits | Original erhalten | Neue Commit-Hashes |
| Merge-Commit | Ja | Nein |
| Konfliktlösung | Einmal | Pro Commit möglich |
| Sicher für | Shared Branches | Lokale Branches |
Merge verwenden
# Feature-Branch in main mergen git checkout main git merge feature-branch # Mit Merge-Commit erzwingen git merge --no-ff feature-branch # Fast-Forward wenn möglich git merge --ff-only feature-branch
Wann Merge?
✅ Merge ist gut für:
- Shared/Public Branches
- Feature-Branches in main/develop
- Wenn History erhalten bleiben soll
- Team-Kollaboration
Rebase verwenden
# Feature-Branch auf main rebasen git checkout feature-branch git rebase main # Interaktiver Rebase (Commits bearbeiten) git rebase -i main git rebase -i HEAD~3 # Letzte 3 Commits # Nach Rebase in main mergen (fast-forward) git checkout main git merge feature-branch
Interaktiver Rebase
git rebase -i HEAD~4 # Editor öffnet sich: pick abc1234 Add user model pick def5678 Add user controller pick ghi9012 Fix typo pick jkl3456 Add tests # Optionen: # pick = Commit verwenden # reword = Commit verwenden, Message ändern # edit = Commit verwenden, aber stoppen zum Bearbeiten # squash = Mit vorherigem Commit zusammenführen # fixup = Wie squash, aber Message verwerfen # drop = Commit löschen # Beispiel: Commits zusammenführen pick abc1234 Add user model squash def5678 Add user controller fixup ghi9012 Fix typo pick jkl3456 Add tests
Wann Rebase?
✅ Rebase ist gut für:
- Lokale Feature-Branches aktualisieren
- Commits aufräumen vor PR
- Lineare History bevorzugt
- Eigene, nicht gepushte Commits
Die goldene Regel
⚠️ NIEMALS rebasen:
Commits die bereits gepusht und von anderen verwendet werden! Rebase ändert Commit-Hashes – das führt zu Chaos im Team.
# ❌ NICHT machen: git checkout main git rebase feature # main ist shared! # ❌ NICHT machen: git push origin feature # ... später ... git rebase main git push --force origin feature # Wenn andere daran arbeiten! # ✅ OK: git checkout my-local-feature git rebase main git push origin my-local-feature # Erster Push, niemand hat es
Rebase + Force Push (sicher)
# Wenn nur Sie am Branch arbeiten: git rebase main git push --force-with-lease origin feature # --force-with-lease ist sicherer als --force # Schlägt fehl wenn jemand anders gepusht hat
Konflikte lösen
# Bei Merge-Konflikten git merge feature # CONFLICT in file.js git status # Zeigt Konflikte # Konflikte in Dateien lösen git add file.js git commit # Merge abschließen # Bei Rebase-Konflikten git rebase main # CONFLICT in file.js # Konflikte lösen git add file.js git rebase --continue # Weiter mit nächstem Commit # Oder abbrechen git rebase --abort
Typischer Workflow
# 1. Feature-Branch erstellen git checkout -b feature/new-login # 2. Arbeiten, committen git add . git commit -m "Add login form" git commit -m "Add validation" # 3. Vor PR: main holen und rebasen git fetch origin git rebase origin/main # 4. Optional: Commits aufräumen git rebase -i origin/main # 5. Pushen git push origin feature/new-login # 6. PR erstellen, Review, Merge (auf GitHub/GitLab)
Squash Merge (GitHub/GitLab)
# Alle Commits eines PRs werden zu einem: # Feature-Branch: abc123 Add login form def456 Fix styling ghi789 Add tests jkl012 Fix review comments # Nach Squash Merge in main: xyz999 Add login feature (#123) # Aktivieren in GitHub: # Settings → Merge button → Allow squash merging
💡 Empfehlung:
Rebase lokal für saubere History, Merge (oder Squash Merge) für PRs. So haben Sie das Beste aus beiden Welten.