Ich bin neu im Schwitzen und ich versuche den Unterschied zwischen einem Squash und einem Rebase zu verstehen. Soweit ich weiß, führt man beim Rebase einen Squash durch.
Sowohl git merge --squash
Als auch git rebase --interactive
Können ein "gequetschtes" Commit erzeugen.
Aber sie dienen unterschiedlichen Zwecken.
erzeugt ein Squash-Commit für den Zielzweig, ohne eine Zusammenführungsbeziehung zu markieren.
(Hinweis: Es wird nicht sofort ein Commit erzeugt: Sie benötigen einen zusätzlichen git commit -m "squash branch"
)
Dies ist nützlich, wenn Sie den Quellzweig vollständig wegwerfen möchten, 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"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
und dann den Zweig tmp
löschen.
Hinweis: git merge
Hat die Option --commit
, aber seit Git 2.22.1 (Q3 2019) können Sie es nicht mit git merge --squash
Verwenden.
Siehe Commit 1d14d0c (24. Mai 2019) bis Vishal Verma (reloadbrain
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Festschreiben 33f279 , 25. Juli 2019)
merge
: verweigere--commit
mit--squash
Zuvor wurde bei der Angabe von
--squash
Im Hintergrund "option_commit
" Verworfen. Dies könnte für einen Benutzer überraschend gewesen sein, der versucht hat, das No-Commit-Verhalten von Squash mit--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 (oder in jüngerer Zeit "reparieren", siehe diese SO-Frage ), direkt zu:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Wenn Sie sich dafür entscheiden, alle Commits von tmp
zu quetschen (aber im Gegensatz zu merge --squash
Können Sie einige wiederholen und andere quetschen).
Die Unterschiede sind also:
merge
berührt nicht Ihren Quellzweig (tmp
hier) und erstellt ein einzelnes Commit, wo Sie möchten.rebase
können Sie auf demselben Quellzweig weitermachen (noch tmp
) mit: Commits zusammenführen: Behält alle Commits in Ihrem Zweig bei und verschachtelt sie mit Commits im Basiszweig
Merge Squash: behält die Änderungen bei, lässt jedoch die einzelnen Commits aus dem Verlauf aus
Neu starten: Dadurch wird der gesamte Feature-Zweig an die Spitze des Master-Zweigs verschoben und alle neuen Commits werden effektiv in den Master aufgenommen
Mehr zu hier
Merge Squash führt einen Baum (eine Folge von Commits) zu einem einzigen Commit zusammen. Das heißt, es komprimiert alle Änderungen, die in n vorgenommen wurden, zu einem einzigen Commit.
Das erneute Basieren ist das erneute Basieren, dh das Auswählen einer neuen Basis (übergeordnetes Festschreiben) für einen Baum. Vielleicht ist der Mercurial-Begriff dafür klarer: Sie nennen es Transplantation, weil es nur so ist: einen neuen Grund (Eltern-Commit, Wurzel) für einen Baum auswählen.
Bei einem interaktiven Rebase haben Sie die Möglichkeit, die zu rebasierenden Commits zu quetschen, auszuwählen, zu bearbeiten oder zu überspringen.
Hoffe das war klar!