Wenn ich Git verwende, sollte ich vor dem Zusammenführen ein Rebase durchführen?
Lesezeit: 6 Minuten
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
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
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
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.
Niemals die Entwicklung umbasieren, niemals den Verlauf eines Trunks ändern (es sei denn, Sie und Ihr Team wissen, was Sie tun).
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.
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.
12063100cookie-checkWenn ich Git verwende, sollte ich vor dem Zusammenführen ein Rebase durchführen?yes
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 angewendetdevelop
anstelle des ursprünglichen Verzweigungspunkts, was bedeutet, dass Sie (Kopien von) alten Commits erhalten, deren Eltern (zwischen dem ursprünglichen Verzweigungspunkt unddevelop/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