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 merge
fü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 1
führt zurück zu dem Verhalten des Elternelements aus dem Zweig, in den ihr die Änderungen übernommen habt.
-m 2
fü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 --squash
ermö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 rebase
verschiebt 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 -i
interaktiv 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 rebase
nicht sicher fühlt, dann lasst es einfach sein! Ihr könnt stattdessengit merge
odergit commit --amend
verwenden.