Wenn ich Git verwende, sollte ich vor dem Zusammenführen ein Rebase durchführen?

Lesezeit: 6 Minuten

Benutzer-Avatar
Code-Junkie

Ich arbeite an einem großen Rails-Projekt und das Team, mit dem ich zusammenarbeite, verwendet Github, um das Projekt zu verwalten. Während an vielen Änderungen lokal gearbeitet und dann direkt in unseren Entwicklungsbranch gepusht wird, erstellen wir einen Branch, wenn wir an einer sehr großen Änderung arbeiten. Wenn es an der Zeit ist, diesen Branch wieder in denDevelopment-Zweig zusammenzuführen, versuche ich oft, den Development-Zweig zurück in meinenFeature-Branch zu rebasen, bevor ich meinen Feature-Branch in denDevelopment-Zweig zusammenführe (um zu verhindern,dass die Arbeit anderer Leute überschrieben wird). Ich finde, wenn ich das tue, scheine ich zweimal auf die gleichen Merge-Konflikte zu stoßen. Beim Rebasing stoße ich auf eine ganze Liste von Konflikten, und beim Zusammenführen stoße ich erneut auf dieselbe Liste von Konflikten. Sollte ich development in meinen Feature-Branch rebasen, bevor ich mein Feature in development merge, oder sollte ich mein Feature einfach in Develop mergen?

Nehmen wir an, mein Feature-Zweig heißt “new_feature”. Mein Prozess zum Zusammenführen mit dem „develop“-Zweig sieht folgendermaßen aus:

git checkout develop 

git pull (this is set up on our rig to always pull rebase)

git checkout new_feature 

git rebase develop 

(lots of merge conflicts ensue) 

git checkout develop  

git merge -no-ff new_feature 

(same set of merge conflicts again)

Es ist, als ob die Zeitachsenänderungen von meiner Rebase dazu führen, dass sich mein neuer Feature-Zweig den ganzen Weg zurück spiegelt und dann Konflikte mit einer Psudo-Kopie von sich selbst entwickelt.

  • warum git merge -no-ff? Wenn Sie new_feature einfach auf development umbasiert haben, ist es sollte ein schneller Vorlauf sein.

    – Nicht zu gebrauchen

    2. Februar 2012 um 18:03 Uhr

  • Ich bin mir ehrlich gesagt nicht sicher. Eine Zeit lang hatten wir hier einen Typen, der Git wirklich kannte, und er sagte mir, dass ich es aus irgendeinem Grund, der mit dem Aufräumen der Timeline zu tun hatte, so machen sollte. Ich weiß nicht genau, was der Grund war.

    – Code-Junkie

    2. Februar 2012 um 18:06 Uhr

  • Ich kann sehen, dass es die Zeitleiste verwirrend machen könnte … hmm. Die Rebase ersetzt alle Commits auf new_feature mit entsprechenden Änderungen angewendet develop anstelle des ursprünglichen Verzweigungspunkts, was bedeutet, dass Sie (Kopien von) alten Commits erhalten, deren Eltern (zwischen dem ursprünglichen Verzweigungspunkt und develop/HEAD) sind älter als sie.

    – Nicht zu gebrauchen

    2. Februar 2012 um 18:15 Uhr


  • Ich habe new_feature nicht auf development umbasiert, oder? Ich dachte, ich würde development auf new_feature umbasieren.

    – Code-Junkie

    2. Februar 2012 um 18:29 Uhr

  • Der Grund für die Verwendung --no-ff Selbst wenn die Zusammenführung ein Schnellvorlauf wäre, werden die Commits logisch gruppiert, wobei die Tatsache beibehalten wird, dass sie sich zu einem bestimmten Zeitpunkt in einem Zweig in der Historie befanden. Es ist besonders nützlich, wenn der Branch viele Commits enthält und es sinnvoll ist zu sehen, dass sie alle Teil desselben Feature-Branch als hinzugefügter Kontext waren.

    – Andreas Marshall

    2. Februar 2012 um 21:11 Uhr

OK, das ist jetzt zu lang für einen Kommentar.

Um das Handbuch zu paraphrasieren (git help rebase)

   Assume the following history exists and the current branch is "new_feature":

                 A---B---C new_feature
                /
           D---E---F---G develop


   From this point, the result of either of the following commands:

       git rebase develop
       git rebase develop new_feature

   would be:

                         A'--B'--C' <new_feature
                        /
           D---E---F---G <develop

Nun, wenn Sie Konflikte hatten, der Ist-Zustand nach dem ersten Ausführen rebase wird sein

              A'--B'--C'--[local state]
             /        ^
D---E---F---G          new_feature
            ^ develop

wo [local state] ist die widersprüchliche Zusammenführung, die Sie noch beheben müssen. Nachdem Sie die Zusammenführungskonflikte gelöst und die gelösten Dateien zum Index hinzugefügt haben, führen Sie sie aus git rebase --continue: jetzt wird Ihr Zustand sein

              A'--B'--C'--H <new_feature
             /
D---E---F---G <develop

Offensichtlich kann an dieser Stelle das Zusammenführen von new_feature wieder mit dem Entwickeln wie folgt vorgespult werden:

              A'--B'--C'--H <new_feature  <develop
             /
D---E---F---G

aber wenn nicht, bekommst du stattdessen dies

              A'--B'--C'--H <new_feature
             /             \
D---E---F---G---------------I <develop

Was auch immer Sie aus Sicht der Zeitleiste bevorzugen, es ist nicht offensichtlich, warum beide ein Problem haben würden … es sei denn, Sie haben die Rebase nie abgeschlossen und die Konflikte damit gelöst Haber ich würde denken, Git würde sich darüber beschweren.

  • “aber wenn nicht, bekommst du stattdessen das hier”? “ist” was nicht? Ich verstehe nicht, wie man eines dieser Szenarien verursacht. Was war der Unterschied?

    – Umagon

    18. September 2017 um 14:04 Uhr

  • … kann vorgespult werden … aber wenn nicht …“. Wenn Sie die Zusammenführung nicht vorspulen möchten, mit --no-fferhalten Sie einen Merge-Commit, anstatt nur den Verzweigungszeiger zu verschieben, wie das Diagramm zeigt. Wenn Sie jedoch keines der beiden Szenarien von Anfang an verstehen, müssen Sie wahrscheinlich Ihre eigene Frage stellen oder anderweitig mehr über Git erfahren, da ich nicht wirklich erraten kann, wo Sie diese Antwort verloren hat.

    – Nicht zu gebrauchen

    18. September 2017 um 15:06 Uhr

Klingt für mich so, als würden Sie Rebase rückwärts verwenden, aber es könnte nur eine verwirrende Formulierung sein.

Ich würde den Feature-Zweig rebasen auf zu entwickeln und dann (beim Entwickeln) a ausführen git merge --ff-only feature.

  • Ich arbeite daran, meinen Beitrag zu bearbeiten, um den Prozess zu zeigen, um zu sehen, ob ich es falsch mache.

    – Code-Junkie

    2. Februar 2012 um 17:52 Uhr


  • Wie @Useless kommentierte, sollte das Zusammenführen ein schneller Vorlauf sein (ich erzwinge es lieber mit –ff-only). Der Rest scheint in Ordnung zu sein, obwohl Ihre Art, es in Worte zu fassen, nicht der Standard ist. Ich würde empfehlen zu lesen progit.org/book

    – madth3

    2. Februar 2012 um 18:14 Uhr

Da Sie in derselben Frage “groß angelegt” und “rebasieren” angeben, würde ich Ihnen raten, dies nicht zu tun. Verwenden Sie stattdessen Zusammenführungen.

Die Verwendung von –no-ff in Zusammenführungen ist großartig, um den ursprünglichen Verzweigungspunkt beizubehalten. Ich unterstütze die Verwendung.

  • Die Behauptung, dass „groß angelegt“ und „umbasiert“ einander unangemessen seien, ist falsch. Unabhängig davon, wie groß das Projekt ist, ist es bei der Arbeit mit Feature-Zweigen tatsächlich eine bewährte Methode, sie vor dem Mergen neu zu basieren. Was falsch ist, sind diese Versuche, die Entwicklung umzubasieren, die von einem Team verwendet werden, was eine schlechte Praxis ist, unabhängig von der Größe des Projekts (in den allermeisten Fällen).

    – Greg Rynkowski

    15. Oktober 2021 um 23:52 Uhr

  1. Rebasen Sie Ihren Feature-Branch, führen Sie ihn zusammen, fertig. Dass “den Feature-Zweig vor dem Zusammenführen umbasieren” ist meiner Meinung nach eine bewährte Methode.

  2. Niemals die Entwicklung umbasieren, niemals den Verlauf eines Trunks ändern (es sei denn, Sie und Ihr Team wissen, was Sie tun).

  3. Rebase ist nur eine Reihe von Cherry-Picks, beginnend am Anfang des Zweigs. Wenn Sie „Develop“ auf „Feature Branch“ umbasen, legen Sie tatsächlich alle Entwicklungs-Commits oben auf den Feature-Branch, was keinen Sinn ergibt.

  4. Wenn Sie Ihre Arbeit nach dem Zusammenführen des Feature-Zweigs fortsetzen, starten Sie einfach einen neuen Zweig aus der Entwicklung und Sie sind bereit, an der nächsten Sache zu arbeiten.

1206310cookie-checkWenn ich Git verwende, sollte ich vor dem Zusammenführen ein Rebase durchführen?

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

Privacy policy