Beide git merge --squash
y git rebase --interactive
kann eine "zerquetschte" Übergabe erzeugen. Sie dienen jedoch unterschiedlichen Zwecken.
erzeugt eine gequetschte Übergabe auf dem Zielzweig, ohne eine Zusammenführungsbeziehung zu markieren. (Hinweis: Es wird nicht sofort ein Commit erzeugt: Sie benötigen eine zusätzliche git commit -m "squash branch"
)
Dies ist nützlich, wenn Sie den Ursprungszweig komplett wegwerfen wollen, indem Sie von (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"
# In the following graph, G is c--d--e--f--g squashed together
X-------------G stable
/
a---b---c---d---e---f---g tmp
und dann das Löschen tmp
Zweigstelle.
Nota: git merge
hat eine --commit
Option aber es kann nicht verwendet werden mit --squash
. Es war niemals möglich zu verwenden --commit
y --squash
zusammen. Seit Git 2.22.1 (Q3 2019) wird diese Inkompatibilität explizit gemacht:
参照 1d14d0c übertragen (24. Mai 2019) von Vishal Verma ( reloadbrain
) . (Zusammengefasst von Junio C. Hamano -- gitster
-- en 33f2790 übertragen , 25. Juli 2019)
merge
: Abfall --commit
con --squash
Zuvor, als --squash
geliefert wurde, ' option_commit
' wurde schweigend fallen gelassen. Dies hätte einen Benutzer überraschen können, der versucht, das das No-Commit-Verhalten von Squash mit --commit
ausdrücklich.
git/git
builtin/merge.c#cmd_merge()
umfasst jetzt:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
gibt einige oder alle Ihrer Übertragungen auf einer neuen Basis wieder, so dass Sie sie zerquetschen (oder in jüngerer Zeit "aufbessern" können, siehe dies SO Frage ), die direkt zu:
git checkout tmp
git rebase -i stable
stable
X----------------G tmp
/
a---b
Wenn Sie sich dafür entscheiden, alle Übertragungen von tmp
(aber, im Gegensatz zu merge --squash
Sie können sich dafür entscheiden, einige zu wiederholen und andere zu vernichten).
Das sind die Unterschiede:
squash
Ihren Quellzweig nicht berührt ( tmp
hier) und erstellt eine einzelne Übergabe an der gewünschten Stelle.
rebase
ermöglicht Ihnen auf demselben Quellensprung weitergehen (noch tmp
) mit:
- eine neue Basis
- eine sauberere Geschichte