611 Stimmen

Was ist der Unterschied zwischen merge --squash und rebase?

Ich bin neu in Git und versuche, den Unterschied zwischen einem Squash und einem Rebase zu verstehen. So wie ich es verstehe, führt man einen Squash durch, wenn man ein Rebase macht.

613voto

Md Ayub Ali Sarker Punkte 9367

Commits zusammenführen: behält alle Commits in Ihrem Zweig bei und verschmilzt sie mit den Commits im Basiszweig enter image description here

Merge Squash: behält die Änderungen bei, lässt aber die einzelnen Übertragungen aus der Historie aus. enter image description here

Wiederveröffentlichen: Dadurch wird der gesamte Funktionszweig an die Spitze des Master-Zweigs verschoben, so dass alle neuen Übertragungen in den Master-Zweig aufgenommen werden.

enter image description here

Mehr dazu aquí


Die ersten beiden Diagramme stammen aus Über die Zusammenführung von Pull-Anfragen in den GitHub Docs

26 Stimmen

Das erste Diagramm sieht für mich völlig falsch aus. Irgendwie hat das Commit D kein Elternteil mehr.

2 Stimmen

Perfekte Diagramme und Erklärungen!

2 Stimmen

Ich sehe keinen Unterschied zwischen "Merge commit" und "Squash and merge". Es scheint, dass der Master-Zweig im Endzustand in beiden Fällen identisch aussieht.

470voto

VonC Punkte 1117238

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

17 Stimmen

G es c--d--e--f--g zusammengequetscht?

9 Stimmen

@Wayne: Ja, G steht in diesen Beispielen für die tmp Commits zusammengequetscht.

0 Stimmen

Sind die Daten nicht in G genau dasselbe wie in g ? Würde das also bedeuten, dass G ist dasselbe wie g außer, dass es ein anderes Elternteil hat?

188voto

ahmednabil88 Punkte 14906

Beginnen wir mit dem folgenden Beispiel:

enter image description here

Jetzt haben wir 3 Optionen, um Änderungen zusammenzuführen Funktionsbereich en Hauptzweig :

  1. Zusammenführen von Übertragungen
    Behält alle Commits der Geschichte des Funktionsbereich und verschieben sie in den Hauptzweig
    Wird zusätzliche Dummy-Commit hinzufügen.

  2. Neufestlegung und Zusammenführung
    Hängt alle Commits der Geschichte der Funktionsbereich auf der Vorderseite des Hauptzweig
    Fügt KEIN zusätzliches Dummy-Commit hinzu.

  3. Squash und Merge
    Gruppiert alle Funktionsbereich überführt in eine Verpflichtung und fügen Sie es dann vor der Datei Hauptzweig
    Wird zusätzliche Dummy-Commit hinzufügen.

Nachstehend finden Sie, wie die Hauptzweig wird sich um jeden einzelnen von ihnen kümmern.

enter image description here

In allen Fällen:
Wir können die Datei DELETE sicher löschen. Funktionsbereich .

3 Stimmen

Können Sie erklären, was das Dummy-Commit im 2. Bild ist? Ich bin ein Anfänger in Git.

4 Stimmen

@Yusuf, es ist nur ein zusätzlicher Commit, der die Aktualisierungen beider Zweige enthält, die Standard-Commit-Nachricht ist "Megre Zweig XYZ in Master".

1 Stimmen

Für "Squash and merge": Es gibt einen Commit mit allen gruppierten Commits plus einen "extra dummy commit"?

110voto

Mauricio Scheffer Punkte 97391

Merge Squash führt einen Baum (eine Folge von Commits) zu einem einzigen Commit zusammen. Das heißt, es Kürbisse alle Änderungen, die in n Commits zu einem einzigen Commit.

Rebasing ist Re-Basing, d.h. die Wahl einer neuen Basis (parent commit) für einen Baum. Vielleicht ist der Mercurial-Begriff dafür klarer: Sie nennen es Transplantation, weil es genau das ist: eine neue Basis (Eltern-Commit, Root) für einen Baum zu wählen.

Bei einem interaktiven Rebase haben Sie die Möglichkeit, die Commits, die Sie rebasen wollen, entweder zu zerdrücken, auszuwählen, zu bearbeiten oder zu überspringen.

Ich hoffe, das war klar!

14 Stimmen

Wann sollte ich umbasieren und wann sollte ich zerquetschen?

1 Stimmen

0 Stimmen

Es spielt keine Rolle, welche Sie verwenden, aber ich empfehle rebase. Rebase ändert den übergeordneten Knoten des Feature-Zweigs, merge hingegen nicht. Ich empfehle es, weil es die Commit-Struktur einfacher hält, aber als Git-Benutzer macht es keinen Unterschied. stackoverflow.com/questions/2427238/%20for%20a%20tree "in git what is the difference between merge squash and rebase%23%3a%7e%3atext%3dMerge%2520squash%2520merges%2520a%2520tree%2cparent%2520commit)%2520for%2520a%2520tree") .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X