391 Stimmen

Wie halte ich einen Zweig mit dem Master synchronisiert/aktualisiert?

Derzeit treibt mich Git in den Wahnsinn, ich kann keine beste Lösung für das folgende Problem finden.

Es gibt zwei Branches, einen namens master und einen namens mobiledevicesupport. Ich möchte mobiledevicesupport als fortlaufenden Branch beibehalten, der mit dem Master-Branch zusammengeführt/synchronisiert wird, wenn mobiledevicesupport stabil ist. Dies würde Änderungen von mobiledevicesupport in den Master überführen, aber auch alle Änderungen von Master in mobiledevicesupport bringen, sodass der Branch weiterhin bearbeitet und die Funktionen verbessert oder geändert werden können. Dies muss mit einem zentralen Repository und mehreren Entwicklern funktionieren.

Bitte ein Beispiel für ähnliche Workflows, die andere Personen verwenden, oder sagen Sie mir einfach, ob diese Idee dumm ist und ich andere Optionen in Betracht ziehen sollte. Derzeit scheint der Workflow vernünftig zu sein, aber ich weiß einfach nicht, wie ich Git dazu bringen kann, auf diese Weise zu funktionieren.

Vielen Dank, jegliche Hilfe wird sehr geschätzt.

Aktualisierung 1: Wenn ich den Master in mobiledevicesupport und mobiledevicesupport in Master zusammenführen würde, erhalte ich dann replizierte Commits in beiden Branches. Oder ist Git intelligent genug, um herauszufinden, dass ich die neuesten Änderungen von Branch A in Branch B gezogen habe und den Merge-Commit C zu Branch B hinzufüge. Und dass ich die neuesten Änderungen von Branch B in Branch A gezogen habe und den Merge-Commit D zu Branch A hinzufüge?

Ich wollte ein Bild posten, aber ich habe nicht genug Reputation dafür, also muss die folgende Illustration wohl genügen. Zwei kontinuierlich laufende Branches mit häufigen Merges in beide Richtungen. Das Hauptproblem, über das ich mir nicht sicher bin, ist, wie Git die Commits verarbeiten wird und ob es entweder Branches mit den Commits aus dem anderen Branch beim Zusammenführen füllt oder ob es sauber bleibt. Ich habe bereits Rebase verwendet, aber es scheint den Branch zu beenden und alle Commits in den Master zu überführen, oder ich habe etwas falsch gemacht. Vielen Dank für die Hilfe bisher.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

631voto

concept47 Punkte 27887

Ja, mach einfach:

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

um mobiledevicesupport mit master synchron zu halten.

Dann, wenn du bereit bist, mobiledevicesupport in master zu integrieren, zuerst master wie oben zusammenführen, dann:

git checkout master
git merge mobiledevicesupport
git push origin master

und das war's.

Die Annahme hier ist, dass mobilexxx ein Themen-Branch mit Arbeit ist, die noch nicht bereit ist, in deinen Haupt-Branch zu gehen. Also nur in master zusammenführen, wenn mobiledevicesupport an einem guten Punkt ist.

51voto

euphoria83 Punkte 13962

Wenn Sie die Änderungen aus dem Master-Branch in Ihren Arbeits-Branch übernehmen möchten, führen Sie ein git rebase /master durch. Wenn es Konflikte gibt, lösen Sie diese.

Wenn Ihr Arbeits-Branch bereit ist, machen Sie erneut ein Rebase und führen dann git push HEAD:master aus. Dadurch wird der Master-Branch im Remote-Repository (zentrales Repository) aktualisiert.

27voto

a1pancakes Punkte 463

Concept47's Ansatz ist der richtige Weg, es zu tun, aber ich würde empfehlen, mit der Option --no-ff zusammenzuführen, um Ihre Commit-Historie klar zu halten.

git checkout develop
git pull --rebase
git checkout NeuerFeatureBranch
git merge --no-ff master

16voto

RoundPi Punkte 5549

Die akzeptierte Antwort über git merge erledigt die Arbeit, hinterlässt jedoch eine unordentliche Commit-History. Der richtige Weg sollte über 'rebase' erfolgen, indem Sie die folgenden Schritte ausführen (vorausgesetzt, Sie möchten Ihren Feature-Branch mit develop synchronisieren, bevor Sie den abschließenden Push vor dem PR durchführen).

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

2 git rebase origin/develop

3 Wenn ein Konflikt auftritt, lösen Sie ihn Stück für Stück

4 Verwenden Sie git rebase --continue, sobald alle Konflikte behandelt wurden

5 git push --force

9voto

Sachin Punkte 20764

Ja, ich stimme deinem Ansatz zu. Um mobiledevicesupport in den Master zu mergen, kannst du verwenden

git checkout master
git pull origin master // Hole alle neuesten Commits des Master-Zweigs
git merge mobiledevicesupport

Auch kannst du den Master in mobiledevicesupport mergen.

F: Ist das Cross-Merging ein Problem oder nicht.

A: Nun, das hängt von den Commits ab, die im mobile* Zweig und im Master-Zweig seit dem letzten Mal, als sie synchronisiert wurden, gemacht wurden. Nehmen wir dieses Beispiel: Nach der letzten Synchronisierung passieren folgende Commits in diesen Zweigen

Master-Zweig: A -> B -> C [wo A, B, C Commits sind]
Mobile-Zweig: D -> E

Angenommen, der Commit B hat einige Änderungen an der Datei a.txt vorgenommen und der Commit D hat auch einige Änderungen an a.txt vorgenommen. Schauen wir uns jetzt die Auswirkungen jeder Merging-Operation an,

git checkout master // Wechselt zum Master-Zweig
git pull // Hole die Commits, die du noch nicht hast. Vielleicht haben deine Kollegen sie gemacht.
git merge mobiledevicesupport // Es wird versuchen, D und E im Master-Zweig hinzuzufügen.

Jetzt gibt es zwei Arten von möglichen Merges

  1. Fast-Forward-Merge
  2. True-Merge (erfordert manuellen Aufwand)

Git wird zuerst versuchen, einen FF-Merge durchzuführen, und wenn es feststellt, dass Konflikte nicht von Git lösbar sind, schlägt der Merge fehl und bittet dich, zu mergen. In diesem Fall wird ein neuer Commit stattfinden, der für das Auflösen von Konflikten in a.txt verantwortlich ist.

Also Bottom Line ist Cross-Merging ist kein Problem und letztendlich musst du es machen und das ist es, was Synchronisieren bedeutet. Stelle sicher, dass du deine Hände beim Mergen von Branches schmutzig machst, bevor du irgendetwas in der Produktion machst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X