Git: Commits zusammenfassen (Squash)
Zuletzt aktualisiert
Squash fasst mehrere Commits zu einem einzigen zusammen, sodass eine unordentliche Reihe von "wip", "Tippfehler behoben", "jetzt aber wirklich behoben"-Commits zu einem einzigen sauberen Commit wird. Das übliche Werkzeug ist das interaktive Rebase - git rebase -i -, bei dem du die zusammenzufassenden Commits markierst. Da Squash die Historie umschreibt, mach das vor dem Push oder auf einem Branch, an dem nur du arbeitest.
Probiere diese Befehle im Terminal-Playground aus - eine echte Shell in deinem Browser, ganz ohne Installation.
Syntax
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | Rebased die letzten 3 Commits interaktiv |
git rebase -i main | Rebased jeden Commit seit main |
git merge --squash feature | Fasst die Commits eines Branches beim Merge zu einem zusammen |
git reset --soft HEAD~3 && git commit | Fasst die letzten 3 Commits ohne Rebase zusammen |
Befehle des interaktiven Rebase
Ersetze im geöffneten Editor pick durch einen davon.
| Keyword | What it does |
|---|---|
pick | Behält den Commit unverändert |
squash (s) | Fasst mit dem vorherigen Commit zusammen und kombiniert die Nachrichten |
fixup (f) | Fasst zusammen, verwirft aber die Nachricht dieses Commits |
reword (r) | Behält den Commit, bearbeitet aber seine Nachricht |
Praxisbeispiel
Fasse die letzten drei Commits vor dem Push zu einem zusammen.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Öffnet die letzten 3 Commits im Editor |
| 2 | Setze Commit 2 und 3 auf squash | Markiert sie zum Zusammenfassen mit dem ersten |
| 3 | Speichern und die kombinierte Nachricht bearbeiten | Aus drei Commits wird ein sauberer Commit |
FAQ zum Zusammenfassen von Git-Commits (Squash)
Wie fasse ich die letzten N Commits in Git zusammen?
git rebase -i HEAD~N aus (zum Beispiel HEAD~3 für die letzten drei). Lass im Editor den ersten Commit auf pick und ändere die übrigen auf squash (oder fixup, um deren Nachrichten zu verwerfen). Speichere, bearbeite die kombinierte Commit-Nachricht, und die Commits werden zu einem zusammengefasst.Was ist der Unterschied zwischen squash und fixup?
squash behält die Nachricht des Commits und lässt dich diese in einem Editor mit den anderen kombinieren. fixup verwirft die Nachricht des Commits vollständig und behält nur die des vorherigen Commits - praktisch für "ups, kleine Korrektur"-Commits, die du nicht in der finalen Nachricht haben willst.Wie fasse ich beim Mergen einen ganzen Branch zusammen?
git merge --squash feature und dann git commit. Das übernimmt alle Änderungen des Branches als gestagte Änderungen und lässt dich sie als einen einzigen Commit auf dem Ziel-Branch festhalten, ohne die einzelnen Commits des Branches zu übernehmen. Der "Squash and merge"-Button von GitHub macht dasselbe.Kann ich ohne interaktives Rebase zusammenfassen?
git reset --soft HEAD~N setzt den Branch N Commits zurück, behält dabei alle Änderungen gestagt, und ein einziges git commit hält sie dann als einen fest. Das ist ein schneller Weg, die neuesten Commits zusammenzufassen, ohne den Rebase-Editor zu öffnen.