Github „Squash and Merge“ – anschließender Pull-Request mit allen bisherigen Änderungen

Lesezeit: 6 Minuten

Benutzer-Avatar
irgendein Benutzer

Ich habe einen Zweig, den ich vom Hauptzweig gezogen habe. Nennen wir es Integration.

Im Integrationszweig habe ich verschiedene Commits (C1, C2, C3) gemacht. Wenn ich fertig bin, habe ich eine Pull-Anfrage an den Master-Zweig gestellt. Vom Master-Zweig aus habe ich ein „Squash and Merge“ durchgeführt, sodass es nur zu einem einzigen Commit im Master führt. Das scheint alles großartig zu sein.

Aber später habe ich einige zusätzliche Änderungen am Integrationszweig vorgenommen, und wenn ich erneut eine Pull-Anfrage mache, sehe ich alle Commit-Kommentare früherer Änderungen (C1, C2, C3, C4), die ich bereits festgeschrieben habe. Dieses Problem tritt nicht auf, wenn ich in meinem früheren Commit die Standardeinstellung „Create an Merge Commit“ verwende. Was habe ich falsch gemacht?

  • Ich denke diese Antwort könnte dir helfen. Aber statt Zweige müssen Sie den gemeinsamen Vorfahren selbst finden. stackoverflow.com/a/70994400/1759443

    – Kyle Venn

    5. Februar um 0:45 Uhr

Benutzer-Avatar
Schwern

Visuell ist es einfacher zu verstehen. Hier ist Ihr Repo. master ist am Commit Bund dein feature branch ist am Commit C3.

A - B [master]
     \
      C1 - C2 - C3 [feature]

Eine normale Zusammenführung tut dies. Ein neuer Merge-Commit, BC123wird hinzugefügt, indem der Inhalt kombiniert wird master mit denen drin feature. Die Geschichten sind miteinander verknüpft. Beachten Sie, dass feature bewegt sich nicht, es ist immer noch an C3.

A - B ------------- BC123 [master]
     \            /
      C1 - C2 - C3 [feature]

Ein Squash and Merge tut dies.

A - B ------------- BC123 [master]
     \
      C1 - C2 - C3 [feature]

BC123 enthält den gleichen zusammengeführten Inhalt wie zuvor, aber es besteht keine Verbindung zum feature Zweig. Und wieder, feature ändert sich nicht. feature wird nicht gequetscht, es bleibt haften. Stattdessen BC123 enthält die gestauchten Änderungen aus feature.

Wenn Sie mehr gearbeitet haben featurebegeht C4 und C5 hier ist das passiert.

A - B ------------- BC123 [master]
     \
      C1 - C2 - C3 - C4 - C5 [feature]

Und wenn Sie eine Pull-Anfrage stellen, werden alle Änderungen übernommen feature nicht in master wird auftauchen. Was Git betrifft, ist das so C1 zu C5. Wenn Sie erneut Squash & Merge durchführen würden, würde ein neuer Commit erfolgen masteraber nur mit dem Inhalt von C4 und C5, da Git ziemlich gut darin ist, doppelte Inhalte zwischen Zweigen herauszufinden.

A - B ------------- BC123 - C45 [master]
     \
      C1 - C2 - C3 - C4 - C5 [feature]

Während du kann Arbeit auf diese Weise, es ist verwirrend.

Um es kurz zu machen: Sobald Sie einen Zweig zusammengeführt haben, arbeiten Sie nicht mehr daran. Lösche es. Wenn Sie mehr Arbeit erledigen müssen, öffnen Sie einen neuen Zweig.

Dieses Problem tritt nicht auf, wenn ich in meinem früheren Commit die Standardeinstellung „Create an Merge Commit“ verwende.

Zurück zur fusionierten Version…

A - B ------------- BC123 [master]
     \            /
      C1 - C2 - C3 [feature]

Wenn Sie mehr arbeiten feature

A - B ------------- BC123 [master]
     \            /
      C1 - C2 - C3 - C4 - C5 [feature]

Und dann machen Sie eine Pull-Anfrage, Git zeigt Ihnen die Commits darin feature die nicht drin sind master. Aufgrund der Fusion master enthält C1, C2und C3. Die PR zeigt dir also nur C4 und C5. Das ist immer noch verwirrend, und es gilt derselbe Rat: Sobald Sie einen Zweig zusammengeführt haben, löschen Sie ihn. Öffnen Sie ein weiteres, wenn Sie mehr Arbeit erledigen müssen.

Während Squash & Merge einfacher ist, bietet das Mergen (richtig gemacht) einen gesünderen Verlauf und mehr Informationen, mit denen Git arbeiten kann. Sie werden mehr aus Git herausholen, wenn Sie verstehen, wie das Verzweigen und Zusammenführen funktioniert.

  • Vielleicht bin ich naiv. Der Unterschied in den beiden abgebildeten Zusammenführungsbeispielen ist wirklich nur der Zusammenführungspfeil. Ist es nicht möglich, Booth Squash-and-Merge zu machen und einen Merge-Pfeil hinzuzufügen? Squash und Merge haben definitiv einen Wert.

    – einige Benutzer

    9. März 2018 um 19:47 Uhr

  • @someuser: Ja, der Unterschied ist “nur” der Zusammenführungspfeil. Aber das ist ein riesiger Unterschied: Es verändert die Basis zusammenführen (des späteren Zusammenführens), die eine der drei Eingaben für die Aktion „Zusammenführen als Verb“ ist. Verwenden Sie eine andere Zusammenführungsbasis und Sie erhalten ein anderes Zusammenführungsergebnis.

    – Torek

    9. März 2018 um 21:19 Uhr


  • @someuser Ein “Squash & Merge” mit dem Merge-Pfeil ist ein normales Merge. Die Git-Geschichte ist nicht linear und verwirrt die Leute (meistens ist Git schuld git log standardmäßig eine lineare Geschichte vortäuschen). Wenn Sie Squash & Merge verwenden, um einen einfacheren, linearen Verlauf zu erhalten, gibt es bessere Möglichkeiten, dies zu erreichen, ohne die Wiedergabetreue zu verlieren. Leider unterstützt Github dies derzeit nicht, Sie müssen es manuell tun.

    – Schwern

    9. März 2018 um 21:23 Uhr


  • @Schwern, im ersten Beispiel (Squash & Merge), wenn ich mich entscheide, Squash & Merge nicht mit dem 2. PR (C4-C5) zu verwenden, sondern stattdessen Standard-Merge zu verwenden, was passiert? Wird der Meister aussehen BC123--C4-C5 und dann wird mein zweig bei master aktuell?

    – einige Benutzer

    10. März 2018 um 22:43 Uhr

  • @someuser master würde einen Merge-Commit mit hinzufügen BC123 und C5 als seine Eltern. feature würde dabei bleiben C5. Beim Zusammenführen wird nur der Zweig aktualisiert, der das Zusammenführen durchführt. Der andere Zweig bleibt in Ruhe. Wenn du git merge feature aus master nur master Änderungen. feature bleibt unverändert.

    – Schwern

    11. März 2018 um 0:59 Uhr


Wenn ich deine Situation richtig verstehe…

Die Hauptsache, die Sie falsch machen, besteht darin, einen Zweig weiter zu verwenden, nachdem er zusammengeführt wurde. Löschen Sie nach dem Zusammenführen den Zweig. Zusätzliche Arbeit sollte an einem neuen Zweig erfolgen.

Das erste „Squash and Merge“ betrifft den Integrationszweig nicht; wie die integrierten Commits im Master-Zweig erscheinen. Es ist also sinnvoll, dass A, B und C immer noch vorhanden sind, da Sie den alten Zweig wiederverwenden.

Viel Glück.

  • Das eigentliche Problem ist, dass das gleiche Problem zwischen PR von 2 Repos besteht (wobei eines der Fork des anderen ist). Ich müsste das Repo löschen, um zu vermeiden, dass die alten Commits in meinem nächsten PR auftauchen.

    – einige Benutzer

    9. März 2018 um 19:48 Uhr

  • Ich bin mir nicht sicher, ob ich folgen kann. Ich denke, Sie sollten in der Lage sein, einen neuen Zweig vom Master zu erstellen, in dem C1, C2 und C3 bereits zusammengeführt sind. Sie müssten also nur C4 in den neuen Zweig holen und einen PR eröffnen.

    – Jamie Bisotti

    9. März 2018 um 19:53 Uhr

  • Ich bezog mich auf 2 verschiedene Repos. Wenn ich die Entwicklung auf dem Master von Fork gemacht und es verwendet habe, um PR zu generieren. Ich würde nach einem Squash auf das gleiche Problem stoßen und zusammenführen. Jetzt habe ich zusätzliche Änderungen im Master, die ich mit dem gegabelten Elternteil zusammenführen muss. Cherry-Pick scheint eine Menge Arbeit zu sein, wenn Merge-Konflikte involviert sind.

    – einige Benutzer

    9. März 2018 um 21:57 Uhr

1087380cookie-checkGithub „Squash and Merge“ – anschließender Pull-Request mit allen bisherigen Änderungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy