"Git Pull" oder "Git Merge" zwischen Master- und Entwicklungszweigen

243

Ich habe meine masterNiederlassung und eine developNiederlassung, um an einigen Änderungen zu arbeiten. Ich muss Änderungen von masterin zusammenführen develop, werde aber irgendwann alles von developin zusammenführen master. Ich habe zwei verschiedene Workflows im Sinn:

  1. git pull origin masterin developZweig
  2. git merge masterin developZweig

Welches ist der beste Weg, und warum?

Carson
quelle
18
Empfohlene Lektüre: nvie.com/posts/a-successful-git-branching-model
Alex Brasetvik
2
git pull= git fetch+git merge FETCH_HEAD
Yousha Aleayoub

Antworten:

104

Seien Sie vorsichtig mit Rebase. Wenn Sie Ihren Entwicklungszweig mit anderen teilen, kann Rebase die Dinge durcheinander bringen. Rebase ist nur für Ihre eigenen lokalen Niederlassungen geeignet.

Faustregel: Wenn Sie den Zweig zum Ursprung verschoben haben, verwenden Sie keine Rebase. Verwenden Sie stattdessen Merge.

Eric führt
quelle
Doch ist es sicher, sich git push origin rebasedBranch --forceauf ein privates Repo zu stützen ? Der einzige Benutzer ist ich.
k0pernikus
Ja, wenn Sie der einzige Benutzer sind, ist dies natürlich sicher. Ich benutze Git Push - Force die ganze Zeit, wenn ich der einzige Benutzer bin. :)
Tyler Rick
3
Ich stimme Erics Warnung zu. Es ist jedoch vollkommen in Ordnung, auch Ihren eigenen Remote-Zweig neu zu gründen. Spielen Sie mit Rebase und Merge herum und Sie werden die Vor- und Nachteile jedes einzelnen verstehen und lernen, wann Sie sie verwenden müssen.
Ian Lotinsky
Guter Artikel über die Verwendung von Rebase und sogar das Zusammenführen nach der Lösung von Konflikten: github.com/everpix/Everpix-Intelligence
Ian Lotinsky
@ IanLotinsky Ihr Link verweist nicht auf einen Artikel über Rebase. Longshot, aber hast du noch den richtigen Link? :)
Daniel Serodio
347

Dieser Workflow funktioniert am besten für mich:

git checkout -b develop

... einige Änderungen vornehmen ...

... Hinweis Master wurde aktualisiert ...

... Änderungen vornehmen, um sich zu entwickeln ...

git checkout master
git pull

... diese Veränderungen wieder in die Entwicklung bringen ...

git checkout develop
git rebase master

... noch einige Änderungen vornehmen ...

... verpflichten sie sich zu entwickeln ...

... füge sie zum Meister zusammen ...

git checkout master
git pull
git merge develop
Ian Lotinsky
quelle
2
So arbeite ich auch und finde, dass es gut funktioniert. Eines mache ich allerdings nicht, und das ist git pullkurz vor dem Finale git merge develop. Was ist der Zweck davon?
Crdx
Würde der Checkout-Master nach der Aktualisierung des ... Benachrichtigungsmasters ... Ihre lokalen Änderungen nicht löschen, um sie zu entwickeln, wenn Sie sie nicht festschreiben?
a1an
1
@ a1an Nein, aber wenn Sie sie nicht festschreiben, werden die Änderungen in den Hauptzweig verschoben und git lässt Sie nicht ziehen, bis sie festgeschrieben wurden.
elemjay19
5
@crdx Möglicherweise werden andere Zweige mit dem Remote-Master zusammengeführt, bevor Sie Ihren Zweig mit Ihrem lokalen Master zusammenführen. Sie ziehen Remote-Master-Änderungen und bringen sie in Ihre lokale Master-Kopie. So habe ich es verstanden.
Tarun
12
git pull --rebase origin masterauf Ihrem Entwicklungszweig ist ein bisschen schneller.
Nathan Lilienthal
24

Der beste Ansatz für diese Art von Dingen ist wahrscheinlich git rebase. Es ermöglicht Ihnen, Änderungen vom Master in Ihren Entwicklungszweig zu übernehmen, aber Ihre gesamte Entwicklungsarbeit "über" (später im Festschreibungsprotokoll) dem Material vom Master zu belassen. Wenn Ihre neue Arbeit abgeschlossen ist, ist die Zusammenführung zum Master sehr einfach.

Divegeek
quelle
10
Guter Rat, vorausgesetzt, er developwird mit niemandem geteilt.
Karl Bielefeldt
1
@KarlBielefeldt Wenn develop es mit anderen Mitwirkenden geteilt wird, wie würden wir es aktualisieren, developwenn einige Hotfixes direkt an gesendet würden master? Sollten wir eine Fusion machen, dh git checkout master && git pull --rebase && git checkout develop && git merge master? Ich habe oben einen Kommentar zu der Antwort mit der höchsten Stimme hinterlassen, in dem auch dieses Problem aufgeführt ist.
Modulitos
5

Wenn Sie den Entwicklungszweig mit niemandem teilen, würde ich ihn jedes Mal neu erstellen, wenn der Master aktualisiert wird. Auf diese Weise haben Sie keine Merge-Commits in Ihrem gesamten Verlauf, sobald Sie die Entwicklung wieder zum Master zusammenführen. Der Workflow wäre in diesem Fall wie folgt:

> git clone git://<remote_repo_path>/ <local_repo>
> cd <local_repo>
> git checkout -b develop
....do a lot of work on develop
....do all the commits
> git pull origin master
> git rebase master develop

Mit den obigen Schritten wird sichergestellt, dass Ihr Entwicklungszweig immer über die neuesten Änderungen des Hauptzweigs informiert ist. Sobald Sie mit der Entwicklung des Zweigs fertig sind und die neuesten Änderungen am Master vorgenommen wurden, können Sie ihn einfach wieder zusammenführen:

> git checkout -b master
> git merge develop
> git branch -d develop
KiRPiCH
quelle
1

Meine Faustregel lautet:

rebasefür Zweige mit dem gleichen Namen , mergesonst.

Beispiele für denselben Namen wären master, origin/masterund otherRemote/master.

Wenn developes nur im lokalen Repository vorhanden ist und es immer auf einem kürzlich durchgeführten origin/masterCommit basiert , sollten Sie es aufrufen masterund dort direkt arbeiten. Es vereinfacht Ihr Leben und präsentiert die Dinge so, wie sie tatsächlich sind: Sie entwickeln sich direkt in der masterBranche.

Wenn developes geteilt wird, sollte es nicht neu basiert master, sondern nur wieder mit zusammengeführt werden --no-ff. Sie entwickeln sich weiter develop. masterund develophaben unterschiedliche Namen, weil wir wollen, dass sie unterschiedliche Dinge sind und getrennt bleiben. mach sie nicht gleich mit rebase.

hoijui
quelle