Antworten:
Beides git merge --squash
und git rebase --interactive
kann ein "gequetschtes" Commit erzeugen.
Aber sie dienen unterschiedlichen Zwecken.
erzeugt ein gequetschtes Commit für den Zielzweig, ohne eine Zusammenführungsbeziehung zu markieren.
(Hinweis: Es wird nicht sofort ein Commit erstellt: Sie benötigen ein zusätzliches Commit. git commit -m "squash branch"
)
Dies ist nützlich, wenn Sie den Quellzweig vollständig wegwerfen möchten (Schema aus SO-Frage ):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
zu:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
und dann tmp
Zweig löschen .
Hinweis: git merge
hat eine --commit
Option , kann aber nicht mit verwendet werden --squash
. Es war nie möglich, --commit
und --squash
zusammen zu verwenden.
Seit Git 2.22.1 (Q3 2019) wird diese Inkompatibilität explizit gemacht:
Siehe Commit 1d14d0c (24. Mai 2019) von Vishal Verma ( reloadbrain
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit 33f2790 , 25. Juli 2019)
merge
: ablehnen--commit
mit--squash
Zuvor, als
--squash
geliefert wurde, wurde 'option_commit
' lautlos fallen gelassen. Dies könnte für einen Benutzer überraschend gewesen sein, der versucht hat, das No-Commit-Verhalten von Squash--commit
explizit zu überschreiben .
git/git
builtin/merge.c#cmd_merge()
enthält jetzt:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
Wiederholt einige oder alle Ihrer Commits auf einer neuen Basis, sodass Sie Squash ausführen können (oder in jüngerer Zeit "reparieren", siehe diese SO-Frage ) und direkt zu:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Wenn Sie sich dafür entscheiden, alle Commits von zu quetschen tmp
(aber im Gegensatz dazu merge --squash
können Sie einige wiedergeben und andere quetschen).
Die Unterschiede sind also:
squash
Berührt Ihren Quellzweig ( tmp
hier) nicht und erstellt ein einzelnes Commit, wo Sie möchten.rebase
ermöglicht es Ihnen, mit demselben Quellzweig (noch tmp
) fortzufahren mit:
tmp
Commits.
G
wird g
aufgrund von Änderungen, die durch eingeführt wurden , nicht derselbe Inhalt wie dargestellt X
.
git merge --no-ff temp
anstelle von haben git merge --squash temp
, dann erhalten Sie eine chaotischere Geschichte, aber Sie können auch Dinge wie git revert e
viel einfacher tun . Es ist eine chaotische, aber ehrliche und pragmatische Geschichte, und der Hauptzweig bleibt immer noch ziemlich sauber.
git bisect
oder git blame
wenn es zu oft verwendet wird (wie in git pull --no-ff
: stackoverflow.com/questions/12798767/… ). Es gibt sowieso keinen Ansatz, weshalb in diesem Artikel drei beschrieben wurden ( stackoverflow.com/questions/9107861/… )
Commits zusammenführen: Behält alle Commits in Ihrem Zweig bei und verschachtelt sie mit Commits im Basiszweig
Squash zusammenführen: Behält die Änderungen bei, lässt jedoch die einzelnen Commits aus dem Verlauf aus
Rebase: Dadurch wird der gesamte Feature-Zweig so verschoben, dass er an der Spitze des Master-Zweigs beginnt, wodurch alle neuen Commits effektiv in den Master integriert werden
Mehr dazu hier
Squash zusammenführen führt einen Baum (eine Folge von Commits) zu einem einzigen Commit zusammen. Das heißt, es quetscht alle Änderungen in aus n Commits in einem einzigen begehen.
Beim erneuten Basieren wird erneut basiert, dh es wird eine neue Basis (übergeordnetes Commit) für einen Baum ausgewählt. Vielleicht ist der Quecksilberbegriff dafür klarer: Sie nennen es Transplantation, weil es nur so ist: einen neuen Boden (Eltern-Commit, Wurzel) für einen Baum auswählen.
Wenn Sie eine interaktive Basis neu erstellen, haben Sie die Möglichkeit, die Commits, die Sie neu erstellen möchten, entweder zu quetschen, auszuwählen, zu bearbeiten oder zu überspringen.
Hoffe das war klar!
Beginnen wir mit dem folgenden Beispiel:
Jetzt haben wir drei Möglichkeiten, um Änderungen des Feature-Zweigs in den Hauptzweig zusammenzuführen :
Commits zusammenführen
Behält den gesamten
Commit- Verlauf des Feature-Zweigs bei und verschiebt ihn in den Master-Zweig.
Fügt ein zusätzliches Dummy-Commit hinzu.
Rebase and Merge Hängt den
gesamten Commit- Verlauf des Feature-Zweigs an der Vorderseite des Master-Zweigs an.
Fügt KEIN zusätzliches Dummy-Commit hinzu.
Squash and Merge
Gruppiert alle Feature-Branch- Commits zu einem Commit und hängt sie dann an die Vorderseite des Master-Zweigs an.
Fügt ein zusätzliches Dummy-Commit hinzu.
Nachfolgend finden Sie, wie der Hauptzweig jeden einzelnen von ihnen betreut.
In allen Fällen:
Wir können den Feature-Zweig sicher LÖSCHEN .
G
wirdc--d--e--f--g
zusammengedrückt?