So halten Sie einen Git-Zweig mit dem Master synchron

275

Im Moment, in dem Git meinen Kopf rein macht, kann ich nicht die beste Lösung für Folgendes finden.

Es gibt zwei Zweige, einen als Master und einen als mobiledevicesupport . Ich möchte mobiledevicesupport als kontinuierlichen Zweig beibehalten, der mit dem Master-Zweig zusammengeführt / synchronisiert wird, wenn mobiledevicesupport stabil ist. Dies würde Änderungen von mobiledevicesupport in master zusammenführen, aber auch alle Änderungen von master in mobiledevicesupport zusammenführen, so dass der Zweig weiter bearbeitet und die Funktionen verbessert oder ergänzt werden können. Dies muss mit einem zentralen Repository und mehreren Entwicklern funktionieren.

Bitte ein Beispiel für ähnliche Workflows, die andere Leute verwenden, oder sagen Sie mir einfach, ob diese Idee dumm ist und ich andere Optionen in Betracht ziehen sollte. Im Moment scheint der Workflow solide zu sein, aber ich weiß einfach nicht, wie ich Git auf diese Weise zum Laufen bringen kann.

Vielen Dank, alle Hilfe sehr geschätzt.

Update 1: Wenn ich Master in Mobiledevicesupport und Mobiledevice Support in Master zusammenführen wollte, erhalte ich replizierte Commits in beiden Zweigen. Oder ist git klug genug, um herauszufinden, dass ich die neuesten Änderungen von Zweig A in Zweig B übernommen und Merge Commit C zu Zweig B hinzugefügt habe. Und ich habe die neuesten Änderungen von Zweig B in Zweig A gezogen und Merge Commit D zu Zweig hinzugefügt EIN?

Ich wollte ein Bild posten, habe aber nicht genug Ruf dafür, daher muss die folgende Abbildung ausreichen. Zwei Zweige, die ununterbrochen laufen und häufig in beide Richtungen verschmelzen. Das Wichtigste, bei dem ich mir nicht sicher bin, ist, wie Git die Commits ausspielt und ob es bei Zusammenführungen einen Zweig mit den Commits des anderen Zweigs füllt oder ob es sauber bleibt. Ich habe Rebase schon einmal verwendet, aber es scheint den Zweig zu beenden und alle Commits in den Master zu übertragen, oder ich habe es falsch gemacht. Danke für die bisherige Hilfe.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L
Herr HESEKIEL
quelle
1
Wenn Sie, wie ich, nach einer Anleitung für den GitHub- Client gesucht haben
cregox
1
Diese Frage hat mir jahrhundertelang das Leben gerettet; Vielen Dank für die große Mühe, sich Zeit zu nehmen, um diese wunderbare Frage zu stellen @Mr. HESEKIEL
DJphy
Wenn
koppor

Antworten:

416

Ja, tu es einfach

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

um die Unterstützung mobiler Geräte mit dem Master synchron zu halten

Wenn Sie dann bereit sind, die Unterstützung für mobile Geräte in den Master zu integrieren, führen Sie zuerst den Master wie oben zusammen und dann ...

git checkout master
git merge mobiledevicesupport
git push origin master

und das ist es.

Die Annahme hier ist, dass mobilexxx ein Themenzweig mit Arbeiten ist, die noch nicht bereit sind, in Ihren Hauptzweig zu gehen. Verschmelzen Sie also nur dann mit dem Master, wenn die Unterstützung für mobile Geräte an einem guten Ort ist

concept47
quelle
Das klingt für mich vernünftig. Ich bin mir nicht sicher, wie schmutzig dies den Commit-Verlauf machen würde. Ich werde meine Frage mit einem Beispiel dafür aktualisieren, was meiner Meinung nach passieren würde.
Herr EZEKIEL
1
Sie werden einige "Merge Commits" haben, im Wesentlichen Git, die versuchen, Unterschiede zwischen Ihren Zweigen zu lösen. Wenn Sie sich darüber Sorgen machen UND Sie der einzige sind, der den Zweig verwendet, führen Sie einen "Git-Rebase-Master" anstelle eines "Git-Merge-Masters" durch und drücken Sie die Commits nicht auf den Remote-Zweig. Wenn Sie dies tun, werden Sie feststellen, dass Sie viele Force-Pushs (git push --force) ausführen, um die Unterstützung von origin / mobiledevices zu unterstützen, da Sie (wahrscheinlich) immer senden werden, sei es eine Historie von Commits, die nicht mit was übereinstimmen die Gegenstelle hat. Weitere Details hier git-scm.com/book/en/Git-Branching-Rebasing
concept47
Ich glaube, das ist die richtige Antwort, es klingt genau so, wie ich es will. Ich habe oben eine Abbildung hinzugefügt, um es etwas klarer zu machen, aber wenn das, was Sie sagen, wahr ist, sollte dies genau so funktionieren, wie ich es möchte. Danke dir.
Herr HESEKIEL
2
Lesen Sie dies, um zu verstehen, warum dies kein besonders guter Rat ist: kentnguyen.com/development/visualized-git-practices-for-team/… . Das wurde vom Git-Betreuer geschrieben, daher ist es wahrscheinlich fair zu sagen, dass er weiß, wovon er in Bezug auf dieses spezielle Thema spricht.
Dan Moulding
2
Dadurch wird der Commit-Verlauf unordentlich, siehe meine Antwort per Rebase.
Gob00st
43

Wann immer Sie die Änderungen vom Master in Ihren Arbeitszweig übernehmen möchten, führen Sie a aus git rebase <remote>/master. Wenn es Konflikte gibt. Löse sie.

Wenn Ihr Arbeitszweig fertig ist, starten Sie ihn erneut und führen Sie ihn dann aus git push <remote> HEAD:master. Dadurch wird der Hauptzweig auf der Fernbedienung (zentrales Repo) aktualisiert.

Euphorie83
quelle
3
Was sind die Vor- und Nachteile, wenn Sie dies auf diese Weise tun, anstatt wie in der akzeptierten Antwort?
Hampus Ahlgren
33
Gesund, bis Sie 5 Stunden in der Hölle verbringen
IcedDante
21
Dies gilt nur, wenn sich Ihre Zweigstelle in einem privaten Repository befindet. Stellen Sie niemals etwas wieder her, das stromaufwärts geschoben wurde. Dies ist der Grund: git-scm.com/book/en/v2/…
Kleag
3
Das Problem beim Umbasieren als Umschreiben des Verlaufs besteht darin, dass die SHAs des umbasierten Commits geändert werden und Sie sich daher nicht auf die Ausgabe von (z git branch --contains <commit>. B.) verlassen können .
jnns
13

Der Ansatz von concept47 ist der richtige Weg, aber ich würde empfehlen, mit der Option --no-ff zu verschmelzen, um Ihren Commit-Verlauf klar zu halten.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master
IwishIcanFLighT
quelle
9

Ja, ich stimme Ihrem Ansatz zu. Sie können mobiledevicesupport in master zusammenführen

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Ebenso können Sie Master in mobiledevicesupport zusammenführen.

F. Ob Cross Merging ein Problem ist oder nicht.

A. Nun, es hängt von den Commits ab, die in Mobile * Branch und Master Branch seit der letzten Synchronisierung vorgenommen wurden. Nehmen Sie das folgende Beispiel: Nach der letzten Synchronisierung werden diese Zweige wie folgt festgeschrieben

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Angenommen, Commit B hat einige Änderungen an der Datei a.txt vorgenommen, und Commit D hat auch einige Änderungen an a.txt vorgenommen. Lassen Sie uns einen Blick auf die Auswirkungen der einzelnen Zusammenführungsvorgänge werfen.

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Nun sind zwei Arten der Zusammenführung möglich

  1. Schnellvorlauf-Zusammenführung
  2. Echte Zusammenführung (erfordert manuellen Aufwand)

Git wird zuerst versuchen, FF zusammenzuführen, und wenn es feststellt, dass Konflikte nicht von git gelöst werden können. Die Zusammenführung schlägt fehl und Sie werden zum Zusammenführen aufgefordert. In diesem Fall wird ein neues Commit ausgeführt, das für die Lösung von Konflikten in a.txt verantwortlich ist.

Unterm Strich ist Cross-Merging also kein Problem, und letztendlich müssen Sie es tun, und genau das bedeutet Synchronisierung. Stellen Sie sicher, dass Sie sich beim Zusammenführen von Zweigen die Hände schmutzig machen, bevor Sie etwas in der Produktion tun.

sachinjain024
quelle
1
Cross-Merging wie dieses ist also kein Problem?
Herr HESEKIEL
Cross-Merging ist das, was wir als Synchronisierung bezeichnen, und kein Problem, es sei denn, die Commits in beiden Zweigen verursachen keine Konflikte. Bitte beachten Sie meine aktualisierte Antwort.
sachinjain024
3

Die akzeptierte Antwort über Git Merge erledigt den Job, hinterlässt jedoch eine unordentliche Commit-Geschichte. Der richtige Weg sollte über die folgenden Schritte "neu festgelegt" werden (vorausgesetzt, Sie möchten Ihren Feature-Zweig mit der Entwicklung in Verbindung halten, bevor Sie den letzten Push vor PR ausführen ).

1 git fetchaus Ihrem Feature-Zweig (stellen Sie sicher, dass der Feature-Zweig, an dem Sie arbeiten, auf dem neuesten Stand ist)

2 git rebase origin/develop

3 Sollten Konflikte auftreten, lösen Sie diese nacheinander

4 verwenden, git rebase --continuesobald alle Konflikte behandelt sind

5 git push --force

Gob00st
quelle
1
Dies ist sowohl schwer zu lesen als auch schwer zu verstehen. Bitte aktualisieren Sie Ihre Antwort und verwenden Sie den richtigen Code-Markdown, um Ihre Kommentare von den Befehlen zu trennen.
not2qubit
2

Sie denken in die richtige Richtung. Master mit mobiledevicesupport kontinuierlich zusammenführen und mobiledevicesupport mit master zusammenführen, wenn mobiledevicesupport stabil ist. Jeder Entwickler hat seine eigene Niederlassung und kann je nach Rolle entweder zum Master- oder zum Mobilgeräte-Support zusammengeführt werden.

faisal
quelle