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! đ