Gits rebase Befehl ist für Einsteiger schwer zu verstehen und die Beschreibung der Manpage hilft nicht im Geringsten:
git-rebase – Forward-port local commits to the updated upstream head
Ähhm, wie bitte? Das hilft vielleicht, wenn man weiß, wie Git arbeitet. Aber nicht im Geringsten, wenn du erst mit Git anfängst. Dank Travis Swicegood haben wir eine bessere Metapher:
Ein Beil. Rebase hilft dabei, Commits aufzuteilen und sie in einer Weise zu zerschneiden, wie du sie servieren möchtest und platziert sie exakt an die Stelle, wo sie aus deiner Sicht hingehören. Mit dem Befehl kannst du tatsächlich die Geschichte deines Repositories umschreiben, sei es die Umordnung von Commits, das Zusammenführen in größere Commits, oder sei es das Ignorieren von Commits, wenn du es wünschst.
Warum ist das hilfreich? Eine der verbreitetsten Anwendungsfälle ist die Arbeit an einem bestimmten Feature oder einer Fehlerbehebung in einem separaten Branch. Anstatt häßliche Merge Commits für jede Änderung zu erzeugen, die in den Master Branch überführt werden, könntest du eine große Änderung erzeugen und Rebase alles handhaben lassen. Ein anderer häufig vorkommender Fall für Rebase ist die Pflege von eigenen Änderungen für ein Projekt. Mit Merges wird die Repository-Geschichte mit Upstream-Commits und eigenen Commits vermischt. Mit Rebase wird das verhindert und somit das Repository in einem ausgewogenen Zustand gehalten. Wie das graphisch aussieht, zeigt das Ende von Git for Computer Scientists oder James Bowes’ Beitrag zum Thema.
Ein einfaches Beispiel zeigt die Funktionsweise von Rebase. Ich lege einen neuen Branch für mein Feature an, entwickle daran herum und committe meine Änderungen.
$ git checkout -b newfeature Switched to a new branch "newfeature" [.. changed some files, made a few commits ..] $ git checkout master Switched to branch "master" [.. changed one file, committed ..]
Die History im Repository sieht erstmal so aus (Screenshot von gitx):
Jetzt möchte ich die Änderungen zurück in den Master-Branch überführen. Von dort könnte ich die Änderungen mit git merge newfeature
mergen. Wenn ich das so mache, sähe die Commit History wie folgendermaßen aus:
Mit git rebase newfeature
sähe unsere History stattdessen so aus:
Du siehst, wie alles viel sauberer und kompacter abschließt. Die Änderungen waren relativ einfach, Merge war wirklich einfach und erforderte keinerlei Arbeit. Zukünftige Tipps werden das Auflösen von Merge Problemen, die unterschiedlichen verfügbaren Merge-Algorithmen und natürlich den interaktiven Modus von Rebase behandeln. Dieser Beitrag vermittelt erstmal die Grundlagen zum Befehl selbst. Wenn du nützliche Tricks kennst, die du mit Rebase machst, reiche einen Tip ein!