Commits zusammenfassen (Squash) in PhpStorm 🔧
Du hast also fleißig gearbeitet und dabei mehrere kleine Commits erstellt – vielleicht mit Nachrichten wie „WIP", „Fix typo", „Noch ein Fix" oder „Jetzt aber wirklich fertig". Bevor du diese „Commits des Schreckens" auf GitHub pushst, möchtest du sie zu einem einzigen, sauberen Commit zusammenfassen. Das ist nicht nur guter Stil, sondern macht die Historie für dich und dein Team deutlich lesbarer. Lass mich dich Schritt für Schritt durch den gesamten Prozess führen.
Warum überhaupt Commits squashen?
Bevor wir in die Praxis einsteigen, kurz zum Warum: Eine saubere Commit-Historie ist wie ein gut geschriebenes Tagebuch deines Projekts. Wenn du später (oder ein Kollege) nachvollziehen möchtest, welche Änderung wann und warum gemacht wurde, helfen aussagekräftige Commits enorm. Niemand möchte sich durch zehn „WIP"-Commits wühlen, um zu verstehen, was eigentlich passiert ist.
Vorteile des Squashens:
- Lesbarkeit: Ein Commit pro logischer Änderung statt vieler Mikro-Commits
- Einfacheres Debugging: Mit
git bisectfindest du Bugs schneller, wenn jeder Commit einen sinnvollen Zustand repräsentiert - Saubere Pull Requests: Reviewer können die Änderungen besser nachvollziehen
- Professioneller Eindruck: Zeigt, dass du dir Gedanken über deine Arbeit machst
Die Ausgangssituation
Nehmen wir an, du hast in den letzten Stunden an einem Login-Formular gearbeitet und dabei folgende Commits erstellt (vom ältesten zum neuesten):
a1b2c3d WIP: Login-Formular angefangen
d4e5f6g Passwort-Feld hinzugefügt
h7i8j9k Typo im Label gefixt
l0m1n2o CSS angepasst
p3q4r5s Validation hinzugefügt
Diese fünf Commits sollen zu einem einzigen werden:
x9y8z7w feat: Login-Formular mit Validierung implementiert
Methode 1: Der komfortable Weg über das Git-Log in PhpStorm
Dies ist die empfohlene Methode für die meisten Situationen, da sie visuell und intuitiv ist.
-
Öffne das Git-Tool-Window
Navigiere zu View → Tool Windows → Git oder nutze die Tastenkombination
Alt + 9(Windows/Linux) bzw.⌘ + 9(macOS). Du siehst jetzt das Git-Log mit allen Commits deines Repositories. -
Filtere auf deinen aktuellen Branch
In der Toolbar des Git-Fensters siehst du ein Dropdown-Menü für Branches. Stelle sicher, dass du nur die Commits deines Feature-Branches siehst. Du kannst auch im Suchfeld nach deinem Branch-Namen filtern.
-
Identifiziere den Commit-Bereich
Scrolle durch die Liste und identifiziere die Commits, die du zusammenfassen möchtest. In unserem Beispiel sind das die fünf Commits von „WIP: Login-Formular angefangen" bis „Validation hinzugefügt".
-
Wähle den Basis-Commit aus
Hier wird es wichtig: Du musst den Commit vor deinem ersten zu squashenden Commit finden. Das ist der Commit, auf dem deine Arbeit aufbaut – typischerweise der letzte Commit, bevor du mit dem Feature angefangen hast. Dieser Commit selbst wird nicht verändert, er dient nur als Referenzpunkt.
-
Starte den Interactive Rebase
Klicke mit der rechten Maustaste auf diesen Basis-Commit und wähle im Kontextmenü: Interactively Rebase from Here... (auf Deutsch: „Interaktiv Rebase von hier...").
-
Das Interactive Rebase-Fenster
PhpStorm öffnet jetzt ein Fenster mit dem Titel „Rebasing Commits" oder „Git Interactive Rebase". Du siehst eine Liste aller Commits, die nach deinem gewählten Basis-Commit kommen – also genau die Commits, die du bearbeiten möchtest. Die Liste zeigt:
- Die Aktion (standardmäßig „pick" für jeden Commit)
- Den Commit-Hash (verkürzt)
- Die Commit-Nachricht
-
Commits zum Squashen markieren
Jetzt kommt der entscheidende Schritt. Du hast mehrere Möglichkeiten, die Aktion für jeden Commit zu ändern:
- Doppelklick auf die Aktion öffnet ein Dropdown-Menü
- Rechtsklick auf einen Commit zeigt alle verfügbaren Aktionen
- Wähle mehrere Commits mit
Strg + Klick(Windows/Linux) oder⌘ + Klick(macOS) und ändere die Aktion für alle gleichzeitig
Für das Squashen gehst du so vor:
- Der erste Commit (der älteste, auf den die anderen aufbauen) behält die Aktion „pick"
- Alle folgenden Commits, die du zusammenfassen möchtest, änderst du auf „squash" oder „fixup"
-
Der Unterschied zwischen „squash" und „fixup"
Aktion Beschreibung squash Kombiniert den Commit mit dem vorherigen. Die Commit-Nachricht wird beibehalten, und du kannst sie im nächsten Schritt bearbeiten. fixup Kombiniert den Commit mit dem vorherigen, aber verwirft die Commit-Nachricht. Nutze das für Commits wie „Typo gefixt", deren Nachricht nicht erhalten bleiben muss. Für unser Beispiel könntest du es so konfigurieren:
pick a1b2c3d WIP: Login-Formular angefangen squash d4e5f6g Passwort-Feld hinzugefügt fixup h7i8j9k Typo im Label gefixt squash l0m1n2o CSS angepasst squash p3q4r5s Validation hinzugefügt -
Starte den Rebase
Klicke auf „Start Rebasing" (oder den entsprechenden Button in deiner PhpStorm-Version). PhpStorm beginnt jetzt, die Commits neu zu schreiben.
-
Bearbeite die kombinierte Commit-Nachricht
Nach dem Rebase öffnet PhpStorm ein Fenster, in dem du die neue, kombinierte Commit-Nachricht eingeben kannst. Du siehst dort alle Nachrichten der Commits, die mit „squash" markiert waren (nicht die mit „fixup" – deren Nachrichten wurden verworfen). Das sieht ungefähr so aus:
# This is a combination of 5 commits. # The first commit's message is: WIP: Login-Formular angefangen # This is the 2nd commit message: Passwort-Feld hinzugefügt # This is the 4th commit message: CSS angepasst # This is the 5th commit message: Validation hinzugefügtLösche diesen ganzen Text und schreibe stattdessen eine saubere, aussagekräftige Commit-Nachricht:
feat: Login-Formular mit Validierung implementiert - Login-Formular mit Benutzername- und Passwort-Feld erstellt - Client-seitige Validierung für beide Felder hinzugefügt - CSS-Styling für konsistentes Design angepasst -
Bestätige die Nachricht
Klicke auf „OK" oder „Commit", um den Prozess abzuschließen.
Methode 2: Der schnelle Weg mit „Squash Commits" direkt in PhpStorm
PhpStorm bietet auch eine direkte Squash-Funktion, die noch schneller ist, wenn du weißt, welche Commits du zusammenfassen möchtest.
-
Öffne das Git-Log wie in Methode 1 beschrieben (
Alt + 9oder⌘ + 9). -
Wähle die Commits aus, die du zusammenfassen möchtest. Halte
Strg(Windows/Linux) oder⌘(macOS) gedrückt und klicke auf jeden Commit, den du squashen möchtest. Die Commits müssen aufeinanderfolgend sein. -
Rechtsklick auf die Auswahl und wähle im Kontextmenü: Squash Commits... (auf Deutsch: „Commits zusammenfassen...").
-
Bearbeite die Commit-Nachricht im erscheinenden Dialog und bestätige mit „OK".
Diese Methode ist schneller, bietet aber weniger Kontrolle als der Interactive Rebase – du kannst zum Beispiel nicht einzelne Commits mit „fixup" statt „squash" markieren.
Methode 3: Über das Terminal in PhpStorm
Falls du lieber mit dem Terminal arbeitest oder die grafischen Methoden aus irgendeinem Grund nicht funktionieren, kannst du den Interactive Rebase auch direkt über die Kommandozeile durchführen.
-
Öffne das Terminal in PhpStorm
Navigiere zu View → Tool Windows → Terminal oder nutze
Alt + F12(Windows/Linux) bzw.⌥ + F12(macOS). -
Finde heraus, wie viele Commits du zusammenfassen möchtest
Mit
git log --onelinesiehst du eine kompakte Liste deiner letzten Commits:git log --oneline -10Das zeigt dir die letzten 10 Commits. Zähle, wie viele du squashen möchtest – in unserem Beispiel sind es 5.
-
Starte den Interactive Rebase
git rebase -i HEAD~5Damit sagst du Git: „Ich möchte die letzten 5 Commits interaktiv bearbeiten."
-
Bearbeite die Commit-Liste im Editor
Git öffnet einen Text-Editor (in PhpStorm normalerweise der integrierte Editor oder der von dir konfigurierte). Du siehst:
pick a1b2c3d WIP: Login-Formular angefangen pick d4e5f6g Passwort-Feld hinzugefügt pick h7i8j9k Typo im Label gefixt pick l0m1n2o CSS angepasst pick p3q4r5s Validation hinzugefügtÄndere es zu:
pick a1b2c3d WIP: Login-Formular angefangen squash d4e5f6g Passwort-Feld hinzugefügt fixup h7i8j9k Typo im Label gefixt squash l0m1n2o CSS angepasst squash p3q4r5s Validation hinzugefügtDu kannst auch die Kurzformen verwenden:
pfür pick,sfür squash,ffür fixup. -
Speichere und schließe den Editor
In PhpStorms integriertem Editor klickst du einfach auf den Bestätigungs-Button. Bei Vim-Editoren:
:wqund Enter. -
Bearbeite die kombinierte Commit-Nachricht wie bei Methode 1 beschrieben.
Was passiert, wenn etwas schief geht? 🆘
Keine Panik! Ein Rebase kann abgebrochen werden, solange er noch läuft:
Im Terminal:
git rebase --abort
In PhpStorm: Wenn der Rebase fehlschlägt (z.B. wegen Konflikten), zeigt PhpStorm eine Benachrichtigung an. Du kannst dort „Abort Rebase" wählen, um zum Zustand vor dem Rebase zurückzukehren.
Wenn du den Rebase schon abgeschlossen hast und merkst, dass etwas nicht stimmt, hilft dir das Reflog:
git reflog
Dort siehst du alle Zustände deines Repositories, auch die vor dem Rebase. Mit git reset --hard HEAD@{n} (wobei n die Nummer aus dem Reflog ist) kannst du zu einem früheren Zustand zurückkehren.
Wichtige Hinweise und Warnungen ⚠️
-
Nur unpushte Commits squashen!
Die goldene Regel des Rebasings: Schreibe niemals die Historie um, die bereits gepusht wurde (es sei denn, du bist dir absolut sicher, was du tust, und hast das mit deinem Team abgesprochen). Wenn du bereits gepushte Commits squashst, müsstest du mit
git push --forcepushen, was die Historie für alle anderen Entwickler kaputt macht. -
Force-Push nur bei Feature-Branches
Wenn du an einem Feature-Branch arbeitest, den nur du nutzt, und du bereits gepusht hast, kannst du nach dem Squash einen Force-Push machen:
git push --force-with-lease origin feature/login-formular--force-with-leaseist sicherer als--force, weil es prüft, ob jemand anders in der Zwischenzeit gepusht hat. -
Mache vorher ein Backup (optional)
Wenn du unsicher bist, erstelle vorher einen temporären Branch als Backup:
git branch backup-vor-squashFalls etwas schief geht, kannst du immer zu diesem Branch zurückkehren.
Ein Beispiel-Workflow zusammengefasst
flowchart TD
A["Du hast 5 WIP-Commits\nim Feature-Branch"] --> B["Oeffne Git-Log\nAlt+9 oder Cmd+9"]
B --> C["Finde den Commit VOR\ndeiner Arbeit"]
C --> D["Rechtsklick:\nInteractively Rebase from Here"]
D --> E["Markiere Commits\nmit squash oder fixup"]
E --> F["Klicke: Start Rebasing"]
F --> G["Schreibe eine saubere\nkombinierte Commit-Nachricht"]
G --> H["Bestaetigen"]
H --> I["Fertig: 1 sauberer Commit\nstatt 5 WIP-Commits"]
style A fill:#ffcccc,color:#000000
style I fill:#ccffcc,color:#000000
Zusammenfassung
| Schritt | Aktion |
|---|---|
| 1 | Git-Log öffnen (Alt + 9 / ⌘ + 9) |
| 2 | Basis-Commit identifizieren (der Commit vor deiner Arbeit) |
| 3 | Rechtsklick → „Interactively Rebase from Here..." |
| 4 | Commits mit „squash" oder „fixup" markieren |
| 5 | „Start Rebasing" klicken |
| 6 | Neue, saubere Commit-Nachricht schreiben |
| 7 | Bestätigen – fertig! ✅ |
Mit etwas Übung wird das Squashen zur Routine und deine Commit-Historie wird es dir danken. Dein zukünftiges Ich (und deine Kollegen) werden dich dafür lieben, wenn sie durch eine saubere, nachvollziehbare Historie scrollen können, statt sich durch zwanzig „WIP"- und „Fix"-Commits zu kämpfen! 🎉