Merge-Strategien: Merge vs. Squash vs. Rebase#
Ich verwende git merge, git merge squash und git rebase
situationsabhängig. Sie haben alle ihre Vorzüge, aber ihre Verwendung hängt sehr
stark vom Kontext ab.
git mergefügt einen neuen Commit hinzu, wenn die Zweige zusammengeführt werden.
Dies hat den Vorteil, dass es die wahre Geschichte am besten darstellt. Ihr könnt den Merge und alle WIP-Commits sehen, die beim Entwickeln durchlaufen wurden. Ggf. könnt ihr den Merge einfach rückgängig machen mit
git revert -m|--mainline 1|2 MERGE-COMMIT_SHA.-m 1führt zurück zu dem Verhalten des Elternelements aus dem Zweig, in den ihr die Änderungen übernommen habt.
-m 2führt zurück zu dem Verhalten des Elternelements aus dem Zweig, aus dem ihr die Änderungen übernommen habt.
Tipp
Mehr Commits machen auch git bisect besser, solange für jeden Commit ein Build erstellt werden kann. Bei hundert oder maximal tausend Zeilen, die sich geändert haben, habe ich noch eine Chance, den Bug in angemessener Zeit zu finden.
Siehe auch
git merge --squashermöglicht euch, alle Änderungen aus einem Zweig in einen einzigen Commit über dem aktuellen Zweig zusammenzufassen.
Dies ist sinnvoll, wenn ihr viele kleine WIP-Commits habt, die wirklich alle auf ein Feature abzielen. Dabei achte ich beim Squash darauf, die Commit-Nachricht so umzuschreiben, dass sie möglichst aussagekräftig ist. Die übliche Squash-Commit-Nachricht, die von Git, GitLab etc. erstellt wird, ist meist nicht hinreichend und fügt einfach alle Squash-Commit-Nachrichten zusammen, ggf. eine Reihe von WIP-Commit-Nachrichten.
git rebaseverschiebt eine Folge von Commits zu einem neuen Basis-Commit. Damit bleibt der Vorteil erhalten, mittels git bisect schnell einen Bug finden zu können. Darüberhinaus wird es nun jedoch einfacher, den Kontext, in dem der Bug entstanden ist, zu erkennen.
Tipp
Bei einem großen Diff und vielen WIP-Commits kann
git rebase -iinteraktiv angewendet werden, um selektiv Commits für diesquash-Option auszuwählen und die Commits neu anzuordnen. Macht jedoch immer nur eine Sache:Commits mit der
squash-Option zusammenfassen oderdie Reihenfolge der Commits ändern oder
die Commits bearbeiten.
Versucht nicht, alle Änderungen auf einmal zu machen.
Tipp
Wenn ihr euch bei
git rebasenicht sicher fühlt, dann lasst es einfach sein! Ihr könnt stattdessengit mergeodergit commit --amendverwenden.