it-swarm.com.de

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

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.

320
GiH

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/gitbuiltin/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.
  • Mit rebase können Sie auf demselben Quellzweig weitermachen (noch tmp) mit:
    • eine neue Basis
    • eine sauberere Geschichte
328
VonC

Commits zusammenführen: Behält alle Commits in Ihrem Zweig bei und verschachtelt sie mit Commits im Basiszweigenter image description here

Merge Squash: behält die Änderungen bei, lässt jedoch die einzelnen Commits aus dem Verlauf aus enter image description here

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

enter image description here

Mehr zu hier

130

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!

74