2010-03-11 13 views
251

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?

+4

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

Antwort

271

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 (noch tmp) mit:
    • eine neue Basis
    • eine sauberere Geschichte
+3

'G' ist' c - d - e - f - g' zusammengequetscht? –

+4

@Wayne: Ja, G in diesen Beispielen stellen die zusammengedrückten 'tmp'-Commits dar. – VonC

+0

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? –

67

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!

+1

Wann sollte ich einen Rebase durchführen und wann sollte ich Squash durchführen? –

+2

@MartinThoma https://lwn.net/Articles/328436/ –

31

Merge verpflichtet: alle behält der Commits in Ihrem Zweig und verschachtelt sie mit Commits auf dem Basiszweig enter image description here

Merge Squash: behält die Änderungen aber lässt die einzelnen aus der Geschichte enter image description here

Rebase verpflichtet: Dadurch wird die gesamte Funktionszweig an der Spitze des Master-Zweig beginnen, effektiv alle neuen Commits in Master Einbeziehung

enter image description here

Mehr auf here