🔀Merge & Rebase
Zwei Wege, auseinandergelaufene Branches wieder zusammenzuführen – plus die Werkzeuge für den Ernstfall: Konflikte lösen, Verlorenes mit dem Reflog retten, Arbeit mit stash parken und Fehler mit bisect finden.
⚖️Merge vs. Rebase nebeneinander
🔀 git merge
git merge feature (auf main): ein neuer Merge-Commit mit zwei Eltern verbindet beide Linien. Keine bestehende ID ändert sich.
🪜 git rebase
git merge feature (auf main) ist jetzt ein Fast-Forward: eine gerade Linie ohne Merge-Commit.
| git merge | git rebase | |
|---|---|---|
| Geschichte | bleibt wie sie war, Verzweigungen sichtbar | linear, als wäre alles nacheinander entstanden |
| Commit-IDs | unverändert – nur ein neuer Merge-Commit | alle übertragenen Commits bekommen neue IDs |
| Konflikte | einmal, beim Merge | ggf. pro übertragenem Commit |
| Sicher für geteilte Branches? | ja | nein – nur für eigene, noch nicht geteilte Commits |
| Typischer Einsatz | fertigen Feature-Branch in main übernehmen | eigenen Branch auf aktuellen main bringen, git pull --rebase |
git merge schiebt den Zeiger einfach vor. --no-ff erzwingt trotzdem einen Merge-Commit, --ff-only verweigert alles andere.💥Merge-Konflikte verstehen
ours (HEAD, main)
●───● farbe=grün
╱
●───● Merge-Base: farbe=blau Regel pro Bereich:
╲ • nur eine Seite geändert → diese Änderung
●───● farbe=rot • beide gleich geändert → übernehmen
theirs (feature) • beide verschieden → KONFLIKT<<<<<<< ======= >>>>>>> entfernen und den gewünschten Inhalt herstellen. 2. git add datei 3. git commit (bzw. --continue).git checkout --ours datei bzw. --theirs. Achtung beim Rebase: dort ist „ours“ der Branch, auf den du rebast, und „theirs“ dein eigener Commit.git merge --abort, git rebase --abort, git cherry-pick --abort stellen den Zustand vor dem Befehl wieder her.Selbst ausprobieren: Konflikt im Simulator
🛟git reflog – der Rettungsanker
HEAD@{2} = wo HEAD vor zwei Bewegungen stand. Auch pro Branch: main@{1}, oder zeitlich: main@{yesterday}. Nicht erreichbare Einträge verfallen standardmäßig nach 30 Tagen, die übrigen nach 90.📦git stash – Arbeit parken
Intern ist ein Stash-Eintrag ein Commit (mit dem Index-Stand als weiterem Elternteil) unter refs/stash; ältere Einträge findet man über dessen Reflog: stash@{1}. Unversionierte Dateien werden nur mit git stash -u mitgenommen.
🔎git bisect – Binärsuche nach dem Fehler
git bisect start git bisect bad ca56484 git bisect good b8aa7c5
Quellen: Pro Git 3.2 „Einfaches Branching und Merging“, 3.6 „Rebasing“, 7.3 „Stashen und Bereinigen“, 7.10 „Debuggen mit Git“ (git-scm.com/book/de/v2); git-scm.com/docs/git-merge, git-rebase, git-reflog, git-stash, git-bisect.