HOWTO · Git
Rebase auf ein bestimmtes Commit in Git
Verwenden Sie git rebase --onto, um einen Branch auf einen bestimmten Commit zu rebasen und auszuwählen, welche Commits verschoben werden.
Auf dieser Seite
Um einen Git-Branch auf einen bestimmten Commit umzusetzen, verwenden Sie git rebase --onto <newbase> <upstream> [<branch>]. Git verschiebt die Commits, die vom Branch aus, aber nicht von upstream erreichbar sind, auf newbase. Die Beispiele verwenden new-feature und main; ersetzen Sie die abgekürzten Commit-IDs durch IDs aus Ihrem Repository. Diese Befehle sind native Git-Operationen und dienen als nicht ausgeführte Veranschaulichungen.
In Git auf einen bestimmten Commit rebasen
Prüfen Sie zuerst die Branch-Namen, den Arbeitsbaum und den Commit-Graphen mit git status --short --branch und git log --oneline --graph --decorate --all. Ermitteln Sie den Ziel-Commit, die Upstream-Grenze, die die zu verschiebenden Commits abgrenzt, und den Branch, den Sie rebasen möchten. Ein Rebase schreibt die Commit-Historie um. Vergewissern Sie sich daher, dass Sie am vorgesehenen Branch arbeiten, und stimmen Sie sich ab, bevor Sie einen Branch umschreiben, den andere verwenden.
Die Option --onto erwartet zuerst die neue Basis und danach die Upstream-Grenze. Das optionale dritte Argument gibt den Branch an, der rebaset werden soll; es bezeichnet nicht den neuen übergeordneten Commit. Lassen Sie es weg, rebaset Git den aktuell ausgecheckten Branch, auf den HEAD zeigt.
Angenommen, 846e2fa ist der gewünschte Commit in main und bd9172c die Upstream-Grenze vor den Commits auf new-feature. Um diese Feature-Commits auf den ausgewählten Commit zu verschieben, führen Sie git rebase --onto 846e2fa bd9172c new-feature aus. Git wählt die Commits aus, die von new-feature, aber nicht von bd9172c erreichbar sind, und spielt sie anschließend auf 846e2fa erneut ein.
Den ersten Commit aus dem Rebase-Bereich ausschließen
Um den ersten Feature-Commit auszulassen, verwenden Sie ihn als Upstream-Grenze. Wenn e2ff2bc der erste Commit ist, den Sie ausschließen möchten, führen Sie git rebase --onto 846e2fa e2ff2bc new-feature aus. Git rebaset die Commits, die von new-feature, aber nicht von e2ff2bc erreichbar sind. Dadurch werden e2ff2bc und dessen Vorgänger aus dem ausgewählten Bereich ausgeschlossen. Prüfen Sie vorher den Graphen, um sicherzustellen, dass e2ff2bc die gewünschte Grenze ist und spätere Commits die Änderungen enthalten, die Sie beibehalten möchten.
Den letzten Commit aus dem Rebase-Bereich ausschließen
Das Branch-Argument lässt den letzten Commit des Branches nicht automatisch weg. Um den Bereich auf 846e2fa zu verschieben und dabei den letzten Commit d7dbeb auszulassen, verwenden Sie einen interaktiven Rebase: git rebase -i --onto 846e2fa bd9172c new-feature. Ändern Sie in der Todo-Liste den Befehl für d7dbeb von pick zu drop (oder entfernen Sie die Zeile) und speichern und schließen Sie anschließend den Editor. Lassen Sie die übrigen Commits auf pick. So wird derselbe Bereich nach bd9172c ausgewählt und der unerwünschte letzte Commit beim erneuten Einspielen ausdrücklich ausgelassen.
Neue Historie prüfen und Konflikte behandeln
Prüfen Sie danach mit git log --oneline --graph --decorate --all, ob new-feature auf die erwartete Historie auf Basis von 846e2fa zeigt und nur die vorgesehenen Commits enthält. Vergleichen Sie den Branch bei Bedarf mit main, indem Sie git diff main...new-feature verwenden.
Hält Git wegen eines Konflikts an, prüfen Sie die betroffenen Dateien, lösen Sie die Konflikte und stagen Sie die Lösungen mit git add <file>. Fahren Sie mit git rebase --continue fort. Um den laufenden Rebase zu verwerfen und den Branch auf seinen Ausgangszustand zurückzusetzen, verwenden Sie git rebase --abort. Prüfen Sie die Historie erneut, bevor Sie sie teilen. Da sich beim Rebase die Commit-IDs ändern, müssen Sie das Pushen umgeschriebener Commits in einen gemeinsam genutzten Branch abstimmen; möglicherweise ist ein sorgfältig geprüfter Force-Push erforderlich.