TATECHATLAS
◎ Deutsch
Programmierung

Git merge oder rebase: entscheidend ist die gemeinsame Nutzung

Gemeinsame Historie erhalten oder lokale Commits auf eine neue Basis setzen.

Auf dieser Seite

Merge integriert Historien per Fast-forward oder Merge-Commit. Rebase spielt Commits auf einer neuen Basis erneut ab und erzeugt neue Commit-IDs. Stimmen Sie das Umschreiben einer bereits gemeinsam genutzten Branch ab.

Den Verlauf vor der Entscheidung vorstellen

Während Sie zwei Commits auf feature erstellen, entwickelt sich main weiter. Merge verbindet beide Entwicklungslinien und erhält vorhandene Commits. Bei auseinanderlaufenden Verläufen entsteht normalerweise ein Merge-Commit; andernfalls kann Git den Zeiger lediglich per Fast-forward verschieben.

Rebase wendet Ihre Änderungen auf einer neuen Basis erneut an. Durch die geänderten Vorgänger entstehen neue Commit-Kennungen. Der Verlauf kann übersichtlicher werden, doch Kollegen mit den ursprünglichen Commits besitzen jetzt eine andere Geschichte. Entscheidend sind die gemeinsame Nutzung und die Regeln des Repositories.

Arbeitsstand sichern und Referenzen aktualisieren

Beginnen Sie mit git status. Schließen Sie offene Änderungen ab oder legen Sie sie sicher beiseite. Holen Sie dann den entfernten Stand. git fetch origin aktualisiert origin/main, aber nicht automatisch den lokalen Branch main. So vermeiden Sie eine Integration mit einer veralteten lokalen Referenz.

Das Beispiel setzt origin als Remote und feature als Arbeitsbranch voraus. Ein Sicherungsbranch erhält vor der Integration eine Referenz auf die aktuellen Commits. Verwenden Sie einen neuen Namen, falls dieser bereits existiert. Führen Sie anschließend den passenden Merge- oder Rebase-Ablauf mit origin/main aus, nicht wahllos beide.

git status
git fetch origin
git switch feature
git branch backup-feature

Historie mit merge erhalten

Merge eignet sich, wenn vorhandene Commits unverändert bleiben sollen. Prüfen Sie Branch und Konfliktlösungen vor dem Abschluss.

git switch feature
git merge origin/main

Lokale Arbeit bewusst rebasen

Rebase kann eine lokale Feature-Branch linear halten. Prüfen Sie nach Konflikten den Diff und führen Sie die nötigen Checks erneut aus. Einen laufenden Rebase können Sie abbrechen.

git switch feature
git rebase origin/main

Die Bedeutung des Konflikts auflösen

Widersprüchliche Änderungen können verschiedene fachliche Regeln ausdrücken. Lesen Sie beide Fassungen und den umgebenden Code. Entfernte Konfliktmarker allein belegen kein richtiges Verhalten. Markieren Sie bearbeitete Dateien mit git add als gelöst und lesen Sie den vorgemerkten Diff.

Eine laufende Zusammenführung beenden Sie mit git merge --continue oder brechen mit git merge --abort ab. Für Rebase verwenden Sie git rebase --continue oder git rebase --abort. Weitere Commits können erneut Konflikte auslösen, da Rebase einzeln arbeitet. --skip kann Änderungen auslassen und sollte keinen Konflikt nur zum Schweigen bringen.

Ergebnis prüfen und gezielt wiederherstellen

Vergleichen Sie das Ergebnis mit den erwarteten Änderungen und führen Sie die vorgesehenen Projektprüfungen aus. Wurde ein veröffentlichter Branch neu basiert, stimmen Sie das entfernte Update ab. --force-with-lease kann unerwartete entfernte Änderungen abfangen, ersetzt aber weder Absprache noch die Erlaubnis zum Umschreiben.

Bei später erkannten Fehlern helfen Sicherungsbranch und git reflog. Reflog hält lokale Referenzbewegungen fest und kann den früheren Zustand zeigen. Erstellen Sie vom gefundenen Commit zunächst einen Wiederherstellungsbranch. reset --hard ist kein guter erster Schritt, solange offene Änderungen vorhanden sein könnten.

git reflog --date=iso

Was Sie prüfen sollten

  • Nicht gespeicherte Änderungen prüfen.
  • Andere Nutzer der Branch berücksichtigen.
  • Änderungen nach Konflikten kontrollieren.

Die Befehle setzen feature und main voraus. Beachten Sie die Regeln des Repositorys.

Quellen

  1. Git: rebase ↗
  2. Git: merge ↗
  3. Pro Git: rebasing ↗
  4. Pro Git: branching and merging ↗
  5. Git: fetch ↗
  6. Git: reflog ↗
  7. Git: push and force-with-lease ↗
Nach oben ↑