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 die squash-Option auszuwählen und die Commits neu anzuordnen. Macht jedoch immer nur eine Sache:

  • Commits mit der squash-Option zusammenfassen oder

  • die 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 stattdessen git merge oder git commit --amend verwenden.