Git merge vs rebase: Unterschiede, Beispiele und wann man was nutzt

  1. Startseite
  2. Blog
  3. Softwareentwicklung
Softwareentwicklung

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.

7 Min. Lesezeit
Git merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Das Wichtigste
  • 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

AspektMergeRebase
Form der HistorieVerzweigter Graph mit Merge-CommitsEine gerade Linie
Vorhandene CommitsUnverändertMit neuen Hashes neu geschrieben
KonflikteEinmal im Merge-Commit gelöstEventuell bei jedem abgespielten Commit zu beheben
Sicher auf gemeinsamen BranchesJaNein
Am besten fürFertige Arbeit in main übernehmenDen 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)

Arbeiten Sie mit Stack Quora

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.

Lesen Sie weiter

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.

Künstliche Intelligenz

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 →
DevOps

Erklä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 →
Softwareentwicklung

API-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 →
Testautomatisierung

Spott 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 →
Softwaretests

Code-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 & SQL

DELETE 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 & SQL

Erklä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 →
Softwareentwicklung

TypeScript-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 →
Softwareentwicklung

Python *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 →
Softwareentwicklung

Python-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 Intelligenz

Was 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 →
DevOps

Docker-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 →
Testautomatisierung

TDD 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 →
Softwareentwicklung

Git 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 →
Softwareentwicklung

Python 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 & SQL

SQL 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 →