Git merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Git merge vs rebase entscheidet, wie die Historie Ihres Projekts aussieht. Sehen Sie beides am selben Beispiel mit echter Log-Ausgabe, lernen Sie die eine Regel, die Katastrophen verhindert, und übernehmen Sie einen sicheren Team-Workflow.
- Merge verbindet zwei Branches mit einem neuen Merge-Commit und lässt die Historie so, wie sie entstanden ist.
- Rebase spielt Ihre Commits auf einem anderen Branch neu ab, was eine gerade Linie, aber neue Hashes ergibt.
- Rebasen Sie niemals Commits, die andere bereits geholt haben.
- Rebasen Sie Ihren eigenen Feature-Branch vor dem Pull Request und nutzen Sie Merge, um ihn in den Hauptbranch zu übernehmen.
Ihr Feature-Branch liegt hinter main zurück, und Sie brauchen die neue Arbeit. Git merge vs rebase ist die Wahl zwischen zwei Wegen dorthin, und beide sind korrekt. Sie unterscheiden sich darin, wie die Historie danach aussieht.
Wir haben ein winziges Repository gebaut, beide Befehle ausgeführt und die echte Ausgabe unten eingefügt, damit Sie das Ergebnis vergleichen können, statt es sich vorzustellen. Neu bei Git? Beginnen Sie mit unserem Git-Tutorial für Anfänger (auf Englisch).
Was git merge und git rebase tun
git merge nimmt die Spitzen zweier Branches und kombiniert sie. Haben beide neue Commits, erzeugt Git einen Merge-Commit mit zwei Eltern. Nichts, was bereits existiert, wird verändert.
git rebase nimmt die Commits, die nur auf Ihrem Branch liegen, legt sie beiseite, setzt Ihren Branch auf die Spitze des anderen und spielt Ihre Commits dann nacheinander neu ab. Die abgespielten Commits sind neue Commits mit neuen Hashes, auch wenn ihre Änderungen gleich sind.
Git merge in der Praxis
Unser Ausgangspunkt: Commit A auf main, zwei Commits (F1, F2) auf feature und danach ein weiterer Commit (M1) auf main. Nun mergen wir main in feature.
git switch feature
git merge main
git log --oneline --graph
* f507aab Merge main into feature
|\
| * 8842fb5 M1
* | 082cc6a F2
* | 5a71e3c F1
|/
* 8766865 A
Der Graph zeigt die wahre Geschichte: zwei Arbeitslinien, die zusammengeführt wurden. Die ursprünglichen Commits F1 und F2 behalten ihre Hashes. Der Preis ist ein zusätzlicher Merge-Commit, und in einem belebten Projekt wird der Graph zu einem Geflecht.
Git rebase in der Praxis
Gleicher Ausgangspunkt, aber diesmal rebasen wir feature auf main.
git switch feature
git rebase main
git log --oneline --graph
* 1ff474b F2
* bf9149e F1
* 8842fb5 M1
* 8766865 A
Die Historie ist eine gerade Linie, als hätten Sie Ihre Arbeit nach M1 begonnen. Schauen Sie auf die Hashes: F1 war 5a71e3c und ist jetzt bf9149e, F2 wechselte von 082cc6a zu 1ff474b. Git hat sie neu geschrieben, und deshalb braucht Rebase Sorgfalt.
Merge und Rebase im Vergleich
| Aspekt | Merge | Rebase |
|---|---|---|
| Form der Historie | Verzweigter Graph mit Merge-Commits | Eine gerade Linie |
| Vorhandene Commits | Unverändert | Mit neuen Hashes neu geschrieben |
| Konflikte | Einmal im Merge-Commit gelöst | Eventuell bei jedem abgespielten Commit zu beheben |
| Sicher auf gemeinsamen Branches | Ja | Nein |
| Am besten für | Fertige Arbeit in main übernehmen | Den eigenen Branch vor dem Review aktualisieren |
Tipp: Wenn Sie sich nicht entscheiden können, fragen Sie, wer sonst Ihren Branch hat. Niemand? Dann ist Rebase sicher. Hat ein Kollege ihn geholt, nehmen Sie Merge.
Die goldene Regel des Rebase
Rebasen Sie keine Commits, die außerhalb Ihres eigenen Repositorys existieren. Nach einem Rebase passt Ihr Branch nicht mehr zur Kopie auf dem Server, sodass das Pushen einen Force-Push braucht. Hat ein Kollege auf den alten Commits aufgebaut, widerspricht seine Historie nun Ihrer, und das zu bereinigen ist mühsam.
Den privaten Feature-Branch zu rebasen ist in Ordnung. main oder einen Branch, den andere nutzen, zu rebasen, nicht.
Ein sicherer Team-Workflow
Diese Routine hält die Historie sauber, ohne jemanden zu überraschen. Die meisten Teams nutzen sie vor ihrer CI-Pipeline, etwa der aus unserem GitHub-Actions-CI/CD-Leitfaden (auf Englisch).
git switch feature
git fetch origin
git rebase origin/main # or: git pull --rebase
# fix conflicts, then: git add <file> && git rebase --continue
git push --force-with-lease # only on your own branch
--force-with-lease weigert sich, den Server-Branch zu überschreiben, wenn seit Ihrem letzten Fetch jemand gepusht hat, was ein einfaches --force stillschweigend zerstören würde. Ist der Pull Request genehmigt, mergen Sie ihn in main.
Ein missglücktes Rebase rückgängig machen
Ein Rebase wirkt zerstörerisch, aber die alten Commits bleiben eine Weile im reflog von Git, sodass Sie zurückgehen können.
git reflog # find the commit before the rebase
git reset --hard HEAD@{5} # example position, check reflog first
Legen Sie vor jedem riskanten Rebase mit git branch backup einen Backup-Branch an, dann ist die Wiederherstellung ein einziger Befehl. Betreiben Sie nebenbei eine Datenbank oder Tools in Containern? Lesen Sie unser Docker-Tutorial für Anfänger (auf Englisch).
Fazit
Merge bewahrt die Wahrheit, Rebase hält sie ordentlich. Nutzen Sie Rebase, um Ihren eigenen Branch aufzufrischen, Merge, um ihn auszuliefern, und schreiben Sie niemals eine Historie um, von der andere abhängen.
Häufig gestellte Fragen
Was ist der Unterschied zwischen git merge und git rebase?
Merge kombiniert zwei Branches mit einem Merge-Commit und behält alle vorhandenen Commits. Rebase verschiebt Ihre Commits auf einen anderen Branch und schreibt sie neu, was eine lineare Historie ergibt.
Soll ich Merge oder Rebase verwenden?
Rebasen Sie Ihren eigenen Feature-Branch, um aktuell zu bleiben, und mergen Sie ihn bei der Auslieferung in einen gemeinsamen Branch wie main. Nutzen Sie Merge, sobald andere den Branch teilen.
Ist git rebase gefährlich?
Auf privaten Branches ist es sicher, auf gemeinsamen riskant, weil es Commit-Hashes neu schreibt. Nutzen Sie einen Backup-Branch und das Reflog, um sich bei Problemen zu erholen.
Was macht force-with-lease?
Es erzwingt den Push nur, wenn der Remote-Branch noch dort steht, wo Sie ihn zuletzt gesehen haben, sodass Sie neue Commits eines Kollegen nicht versehentlich überschreiben.
Löscht Rebase meine Commits?
Nein. Es erzeugt neue Commits mit denselben Änderungen, und die alten bleiben im Reflog, bis Git sie aufräumt.
Weiterlernen (englische Artikel)
Brauchen Sie Hilfe bei Tests, WordPress oder SEO?
Wir helfen Teams, bessere Software auszuliefern und ihre Websites auszubauen. Erzählen Sie uns, woran Sie arbeiten, und wir schlagen einen klaren nächsten Schritt vor.
Weitere Anleitungen finden Sie unter Tests, KI und moderne Entwicklung
Hat Ihnen dieser Artikel gefallen? Wählen Sie ein Thema und springen Sie direkt in unsere neuesten Tutorials.
KI-Halluzinationen erklärt: Warum Sprachmodelle Dinge erfinden und wie man sie reduziert
KI-Halluzinationen erklärt: Was sie sind, warum Sprachmodelle sie produzieren, gängige Typen, wie man sie mit Erdung und Eingabeaufforderungen reduz…
Artikel lesen →DevOpsErklärte Umgebungsvariablen: .env-Dateien, Geheimnisse und Konfiguration richtig gemacht
Umgebungsvariablen anhand von Python-Beispielen erklärt, die wir ausgeführt haben: Sie lesen und festlegen, warum jeder Wert ein String ist, .env-Da…
Artikel lesen →SoftwareentwicklungAPI-Ratenbegrenzung erklärt: Algorithmen, Header und Behandlung von 429-Fehlern
API-Ratenbegrenzung anhand einer von uns durchgeführten Simulation erklärt: Token-Bucket, festes Fenster, gleitendes Fenster, 429 Antworten, Ratenbe…
Artikel lesen →TestautomatisierungSpott in Python: unittest.mock, Patch und die Fehler, die Tests zum Lügen machen
Mocking in Python mit unittest.mock, getestet: Mock und return_value, side_effect, Patchen, wo ein Name verwendet wird, Spezifikation und Autospec, …
Artikel lesen →SoftwaretestsCode-Abdeckung erklärt: Leitungs- und Zweigstellenabdeckung und was 100 % wirklich bedeutet
Erklärung der Codeabdeckung anhand eines echten Coverage.py-Laufs: Zeilen-, Zweig- und Bedingungsabdeckung, Lesen eines Berichts, warum bei 100 % Ab…
Artikel lesen →Datenbanken & SQLDELETE vs. TRUNCATE vs. DROP in SQL: Unterschiede, Rollback und Verwendungszweck
DELETE vs. TRUNCATE vs. DROP erklärt mit getestetem SQL: was jeweils entfernt wird, Rollback, Trigger, Identitätsrücksetzung, Geschwindigkeit und wi…
Artikel lesen →Datenbanken & SQLErklärte SQL-Ansichten: Erstellen, nutzen und vermeiden Sie Fallstricke mit Beispielen
SQL-Ansichten anhand der von uns ausgeführten Abfragen erklärt: Erstellen einer Ansicht, Live-Ergebnisse, Ausblenden von Spalten, Leistung, aktualis…
Artikel lesen →SoftwareentwicklungTypeScript-Schnittstelle vs. Typ: Echte Unterschiede, getestet mit dem Compiler
TypeScript-Schnittstelle vs. Typ, überprüft mit dem echten Compiler: Was beide können, was nur einer kann, Deklarationszusammenführung, Erweiterunge…
Artikel lesen →SoftwareentwicklungPython *args und **kwargs erklärt: Flexible Funktionen mit klaren Beispielen
Python *args und **kwargs erklärt mit Code, den wir ausgeführt haben: Packen und Entpacken, Parameterreihenfolge, Nur-Schlüsselwort- und Nur-Positio…
Artikel lesen →SoftwareentwicklungPython-Lambda-Funktionen: Syntax, tatsächliche Verwendung und wann man sie nicht verwendet
Python-Lambda-Funktionen erklärt mit Code, den wir ausgeführt haben: Syntax, Sortierung mit Schlüssel, Karte und Filter, Abschlüsse, die Late-Bindin…
Artikel lesen →Künstliche IntelligenzWas sind KI-Agenten? Wie sie funktionieren, mit einer einfachen Agentenschleife, die Sie ausführen können
Was sind KI-Agenten? Eine einfache Anleitung zur Agentenschleife, zu Tools, Speicher und Leitplanken, mit einer kleinen Python-Schleife, die wir aus…
Artikel lesen →DevOpsÜberwachung vs. Beobachtbarkeit: Der wahre Unterschied, mit Protokollen, Metriken und Traces
Überwachung vs. Beobachtbarkeit erklärt: bekannte und unbekannte Fehler, Protokolle, Metriken und Spuren, eine exemplarische Vorgehensweise für Chec…
Artikel lesen →DevOpsDocker-Volumes vs. Bind Mounts: Containerdaten auf die richtige Art und Weise beibehalten
Docker-Volumes vs. Bind-Mounts erklärt: Warum Containerdaten verschwinden, benannte Volumes, Bind-Mounts, tmpfs, Compose-Beispiele, Backups, Berecht…
Artikel lesen →TestautomatisierungTDD vs. BDD: Hauptunterschiede, eine Funktion, die auf beide Arten entwickelt wurde und wann sie jeweils verwendet werden sollte
TDD vs. BDD erklärt mit einer Rabattfunktion, die in beide Richtungen aufgebaut ist: Rot-Grün-Refaktor mit Code, den wir ausgeführt haben, Gegeben-W…
Artikel lesen →SoftwareentwicklungGit merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Git merge vs rebase erklärt mit echter Log-Ausgabe, einer Vergleichstabelle, der goldenen Regel des Rebase und einem sicheren Team-Workflow.
Artikel lesen →SoftwareentwicklungPython List Comprehension: Syntax, Beispiele und wann man darauf verzichtet
Python List Comprehension erklärt: Syntax, Filter, if-else, verschachtelte Schleifen, gemessene Zeiten und Fälle, in denen eine normale for-Schleife…
Artikel lesen →Datenbanken & SQLSQL Joins erklärt mit Beispielen (Inner, Left, Right, Full)
SQL Joins Schritt für Schritt mit Beispieltabellen und Abfragen verstehen: INNER, LEFT, RIGHT, FULL, CROSS und SELF, plus typische Fehler und Perfor…
Artikel lesen →