Änderungen vom Master in meinen Arbeitszweig ziehen?

16

Wir arbeiten zu zweit an etwas. Wir verwenden diese Zweigstruktur

  • Meister
  • dev-A
  • dev-B

Wir arbeiten beide an verschiedenen Zweigen (dev-A, B) und wann immer wir fertig sind, fördern wir unsere Veränderungen zum Master.

Der Nachteil dabei ist jedoch, dass wir keine Änderungen erhalten, die der andere Entwickler vornimmt. Alles ist im Hauptbaum vorhanden - aber wir können nicht die neuesten Updates erhalten, die der andere Entwickler vorgenommen hat.

Gibt es eine Möglichkeit, dies zu beheben, oder sollten wir unsere Zweigstruktur ändern (pro Feature?)?

Utkarsh Sinha
quelle

Antworten:

16

Ich habe Entwicklerzweige gesehen, die in zwei Hauptszenarien verwendet wurden:

  1. Die Open-Source-Community, in der diese Zweige tatsächlich als Repository-Forks fungieren, sodass Projektbetreuer den Zugriff auf das Master-Repository sperren und die Integration über Pull-Anforderungen erfordern können. Dies macht das Leben für Mitwirkende schwieriger, aber für die Betreuer viel einfacher, was natürlich genau der Punkt ist, und dies ist ein sehr erfolgreiches Modell auf GitHub.

  2. Teams und Organisationen, die nicht durchgehend integriert sind und keine Erfahrung mit Instabilitäten in ihren Bereitstellungen oder, noch schlimmer, Instabilitäten in ihren Builds haben. Diese Teams versuchen im Allgemeinen, Entwicklerzweige zu verwenden, um die Stabilität der Hauptleitung zu schützen. Das Ergebnis ist - normalerweise - eine lange und sehr schmerzhafte Zusammenführungsperiode vor der Veröffentlichung, gefolgt von einer noch längeren und schmerzhafteren Stabilisierungsperiode, was manchmal der Fall ist passiert erst nach der Veröffentlichung.

Ich möchte nicht, dass Sie sich darüber aufregen, warum Sie CI benötigen, aber es ist klar, dass Sie wissen, dass Sie Ihre Änderungen nicht oft genug integrieren, deshalb macht es IMO keinen Sinn, um das Problem herumzutanzen.

Wenn Sie nicht in einem geografisch verteilten Team arbeiten, in dem Änderungen von externen Entwicklern "erfasst" werden müssen, ist das Branch-per-Developer-Modell nicht sehr sinnvoll. Das macht vor allem bei git keinen Sinn, da jeder Entwickler technisch bereits über ein eigenes Repository verfügt. Die meisten Organisationen sollten sich sehr häufig integrieren - etwa mehrmals pro Tag.

Ich gehöre derzeit zu einer Gruppe von ungefähr 35 Mitwirkenden, die in 4 separate Teams aufgeteilt sind. Die meisten Leute checken mindestens 2-3 Mal am Tag ein, manche Leute 10-15 Mal. Es ist ungewöhnlich, dass Builds gebrochen sind und extrem selten, dass sie länger als ein paar Minuten gebrochen bleiben. Git erledigt Zusammenführungen die meiste Zeit so mühelos, dass Remote-Entwicklerzweige nur unnötigen Overhead verursachen. Ziehen Sie es einfach, führen Sie es lokal zusammen und führen Sie Festschreibungstests durch, bevor Sie es verschieben. Es ist ganz einfach.

Wenn Sie unbedingt muss Integration, um die Stabilität des Master - Zweiges, das typische, bewährte Modell aufschieben zu schützen , ist eine verwenden Unstable - Zweig - manchmal genannt Entwicklungszweig , wie sie in den A erfolgreich Git Verzweigung Modell . Wenn Entwickler nicht erfolgreich in diese Branche zusammenführen können (was nur benötigt bauen , nicht einwandfrei laufen) mindestens einmal am Tag, dann haben Sie eine Qualität / Disziplin Problem und nicht eine Revisionskontrolle Problem; Wenn Sie das Problem durch nicht integrierte Entwicklerzweige vertuschen, wird das Problem nur verzögert, und wenn Sie dies tun, werden die möglichen Zusammenführungen viel schmerzhafter und instabiler, als sie wirklich sein müssen.

Feature-Zweige sind nicht die schlechtesten, aber IMO sind nur sehr wenige Projekte groß genug, um sie zu rechtfertigen. Wenn Ihr Projekt sehr umfangreich ist (dh Unmengen von Features, an denen gleichzeitig gearbeitet wird), erzielen Sie bessere Ergebnisse, wenn Sie es in separate autonome Komponenten aufteilen, als wenn Sie das Problem mit der Quellcodeverwaltung auf Papier bringen.

Sie können diesen Rat ignorieren , wenn Sie wollen, und viele Teams, aber einer der Gründe , das Verzweigungsmodell oben verbunden ist , so beliebt und erfolgreich ist , dass es an der Arbeit angefertigt mit Continuous Integration, nicht gegen sie.

Aaronaught
quelle
Ich denke, die Bedeutung der kontinuierlichen Integration kann nicht genug betont werden, sowohl im Sinne der Integration von allem in einen Zweig als auch im Sinne von täglichen / stündlichen Builds (unter Verwendung von Jenkins oder ähnlichem).
Sleske
15

In Ihrer Arbeitsbranche, wenn Sie gehen:

git commit -am "Committing changes before merge"
git merge master

Sie können auch aus dem Zweig der anderen Entwickler zusammenführen

git checkout dev-A
git merge dev-B

Was das tun wird , ist verschmelzen die Änderungen in Master in Ihrem Entwicklungszweig.

scaryrawr
quelle
Ja - das ist eine Möglichkeit. Ich hatte gehofft, git würde dafür einen eleganten Workflow haben.
Utkarsh Sinha
2
Nun, Git funktioniert normalerweise am besten, wenn jeder Entwickler sein eigenes lokales Arbeitsrepository und ein gemeinsames zentrales Repository hat, auf das die Entwickler zugreifen und von dem sie zugreifen. Auf diese Weise können Sie jeweils in denselben Zweigen arbeiten und Aktualisierungen erhalten, indem Sie Änderungen abrufen und in das zentrale Repository verschieben. Das ist wahrscheinlich die Eleganz, die Sie suchen. git übernimmt die Zusammenführung automatisch für Sie, sofern kein Konflikt vorliegt. Git Flow ist eine schöne Ergänzung für den Workflow.
Scaryrawr
Perfecto. Es gibt einige sehr lange Antworten auf diese Frage an einigen Stellen, aber git merge masterim ausgecheckten Feature-Zweig habe ich nach etwas gesucht. Danke
Drenai
3

Wenn dev-A und dev-B unterschiedliche Zweige für unterschiedliche Projekte sind, ist die Antwort von @scaryrawr am besten.

Aber wenn dev-A und dev-B tatsächlich genau derselbe Code sind (dasselbe Projekt), dann wäre eine Alternative, dass beide auf einem der Zweige arbeiten. Beispielsweise erstellen Sie einen Abzweigmaster mit dem Namen "devWork". Sie beide überprüfen devWork, arbeiten daran, schreiben fest und drücken Änderungen. Push-Änderungen würden nicht auf dem Master, sondern in devWork erfolgen. Dann müssen die anderen Benutzer des Zweigs lediglich lokal einen PULL-Vorgang ausführen, um Push-Änderungen zu erhalten.

Sie können dann den Standardmethoden folgen, um die Arbeit an devWork zurück zum Master usw. zu erledigen.

David 'der kahle Ingwer'
quelle