Ich bin neu bei Git und ich versuche den Unterschied zwischen einem Squash und einem Rebase zu verstehen. Wie ich es verstehe, führen Sie einen Squash durch, wenn Sie eine Rebase machen.In Git, was ist der Unterschied zwischen Merge - Squash und Rebase?
Antwort
Sowohl git merge --squash
als auch git rebase --interactive
können einen "gequetschten" Commit erzeugen.
Aber sie dienen verschiedenen Zwecken.
wird eine zerquetschte commit auf dem Zielzweig erzeugen, ohne eine Beziehung merge Markierung.
(Anmerkung: es ist kein sofort produziert begehen: Sie benötigen eine zusätzliche git commit -m "squash branch"
)
Dies ist nützlich, wenn Sie die Quelle Zweig komplett wegwerfen wollen, aus (Schema aus SO question genommen) gehen:
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 tmp
Zweig dann zu löschen.
Replays auf einer neuen Basis einige oder alle Ihrer Commits, so dass Sie quetschen (oder in jüngerer Zeit "reparieren" finden Sie in diesem SO question), gehen Sie direkt zu:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Wenn Sie alle Commits von tmp
quetschen (aber im Gegensatz zu merge --squash
, können Sie wählen, einige zu wiederholen und andere zu quetschen).
So sind die Unterschiede:
merge
nicht berührt Ihre Quelle Zweig (tmp
hier) und erstellt eine einzelne begehen, wo Sie wollen.rebase
können Sie auf der gleichen Quelle Zweig gehen auf (nochtmp
) mit:- eine neue Basis
- eine sauberere Geschichte
'G' ist' c - d - e - f - g' zusammengequetscht? –
@Wayne: Ja, G in diesen Beispielen stellen die zusammengedrückten 'tmp'-Commits dar. – VonC
Sind die Daten in 'G' nicht genau so wie in' g'? Würde das also bedeuten, dass "G" dasselbe ist wie "g", außer dass es ein anderes Elternteil hat? –
Merge Squash führt einen Baum (eine Folge von Commits) zu einem Commit zusammen. Das heißt, es Kürbisse alle Änderungen vorgenommen in n commits in einem einzigen Commit.
Rebasing ist re-basing, dh die Auswahl einer neuen Basis (Eltern-Commit) für einen Baum. Vielleicht ist der springende Ausdruck dafür eindeutiger: Sie nennen es Transplantation, weil es nur das ist: einen neuen Boden (Eltern-Commit, Wurzel) für einen Baum auswählen.
Wenn Sie eine interaktive Rebase durchführen, haben Sie die Möglichkeit, die Commits, die Sie neu la- den möchten, entweder zu quetschen, auszuwählen, zu bearbeiten oder zu überspringen.
Hoffe das war klar!
Wann sollte ich einen Rebase durchführen und wann sollte ich Squash durchführen? –
@MartinThoma https://lwn.net/Articles/328436/ –
Merge verpflichtet: alle behält der Commits in Ihrem Zweig und verschachtelt sie mit Commits auf dem Basiszweig
Merge Squash: behält die Änderungen aber lässt die einzelnen aus der Geschichte
Rebase verpflichtet: Dadurch wird die gesamte Funktionszweig an der Spitze des Master-Zweig beginnen, effektiv alle neuen Commits in Master Einbeziehung
Mehr auf here
Gerade FYI: die neue ** rebase und Merge ** Taste anders verhält sich ein Fütterungsmaterial über die Befehlszeile durchführen! Die akzeptierte Antwort bezieht sich auf das Ausführen einer Rebase von der Befehlszeile. Von [hier] (https://help.github.com/articles/about-pull-request-merges/#rebase-and-merge-your-pull-request-commits): _Das Rebase- und Merge-Verhalten auf GitHub weicht leicht ab von Git-Rebase. Rebase und Merge auf GitHub werden immer die Committer-Informationen aktualisieren und neue Commit-SHAs erstellen, während Git-Rebase außerhalb von GitHub die Committer-Informationen nicht ändert. – GrayedFox