Ist es in GitHub Flow in Ordnung, den Feature-Zweig auf einen anderen Feature-Zweig zu stützen?

22

Wir verwenden GitHub Flow in unserem Projekt und öffnen die meiste Zeit einen neuen Feature-Zweig von master , erledigen dort einige Arbeiten, öffnen eine PR, überprüfen den Code und führen ihn wieder zu master zusammen .

Meine derzeitige Arbeit hängt jedoch von einem anderen Thema ab, an dem gerade gearbeitet wird feature-branch-A. Ist es koscher , meinen Zweig aus diesem anderen Zweig zu erstellen, oder widerspricht das dem Geist von GitHub Flow?

Die Alternative wäre, meinen Zweig auf Master zu gründen und die Änderungen von feature-branch-A(häufig) einzubinden.

Welche Option wird in GitHub Flow bevorzugt?

Borek Bernard
quelle

Antworten:

24

Hier ist der Workflow, dem ich folge, wenn ich von einem Feature-Zweig aus verzweige:

  1. Erstellen Sie feature-branch-Bausfeature-branch-A
  2. Arbeite daran feature-branch-B
  3. Wenn feature-branch-Anach dem Verzweigen weitere Commits hinzugefügt werden , führen Sie einen Rebase feature-branch-Bauf durchfeature-branch-A
  4. Beenden Sie die Arbeit an feature-branch-Bund warten Sie, bis feature-branch-Aes zusammengeführt wird master.
  5. Nach dem feature-branch-AZusammenführen mit masterwird wieder feature-branch-Baufmaster
  6. Zusammenführen feature-branch-Binmaster

Wenn Sie den obigen Arbeitsablauf befolgen, wird angezeigt, dass Sie masternach dem feature-branch-AZusammenführen verzweigt haben . Sie müssen nicht warten, bis der feature-branch-AZusammenschluss abgeschlossen ist, um mit der Arbeit zu beginnen feature-branch-B. Sie erhalten jedoch eine saubere Geschichte ohne komplizierte Bäume.

geoji
quelle
Das war genau die Antwort, nach der ich gesucht habe! Du hast mir die Kopfschmerzen erspart, das zu klären, danke!
Vance Palacio
Nicht bereits veröffentlichte Commits zurücksetzen
Sebi2020
8

Ich denke, das ist völlig in Ordnung, wenn Sie das Feature in einem anderen Feature erstellen.

Aber mach das nicht so oft. Ich sehe einen Entwickler, der das gemacht hat, und ein oder zwei Wochen, in denen er 10 PR zum Zusammenführen rauswirft. Das war für andere Mitglieder völlig anstrengend und auch für das Zusammenführen schwierig. Versuche keine Bäume in git zu machen. Das hilft bei der Suche nach Fehlern.

Ladislav Prskavec
quelle
7

Eine Schlüsselsache, die Git-Flow ansprechen sollte, war die Fähigkeit, über die Rolle eines bestimmten Zweigs nachzudenken und darüber, von wo er abzweigt und zu welchem ​​Zweig er verschmilzt.

Im Idealfall werden alle Zweige auf die Codeline zurückgeführt, von der aus sie zusammengeführt wurden. Dies ist in der Regel eine Zusammenführung von der Hauptlinie (in Git-Flow ist dies dev). Feature-Verzweigungen verzweigen und von dev zusammenführen, Release-Verzweigungen verzweigen und von dev zusammenführen (mit einem zusätzlichen Merge nach master). Hotfixes verzweigen und vom Master zusammenführen (mit diesem zusätzlichen Zusammenführen zurück zum Entwickler).

Jede Codeline verzweigt sich von der übergeordneten Codeline und wird mit dieser zusammengeführt. Eine Codeline kann bei Bedarf jederzeit Code aus anderen Codelines abrufen.

Wenn es sich bei der Verzweigung aus einer Feature-Verzweigung um "Ich möchte auf diese Weise ein Problem in dieser Feature-Verzweigung beheben" handelt, ist dies in Ordnung. Es verzweigt vom Feature-Zweig, schreibt Code fest und führt zum Feature-Zweig zurück (oder wird verworfen).

  1. Verzweigen von Merkmal
  2. Idee erforschen
  3. zum Feature zusammenführen

Was Sie jedoch vermeiden möchten, sieht folgendermaßen aus:

  1. Verzweigen von erforderlicher Funktion
  2. Code bearbeiten
  3. Von dev zusammenführen, sobald die erforderliche Funktion abgeschlossen ist
  4. Überprüfen Sie die Funktionalität (und zusätzliche Commits) im Feature-Zweig
  5. verschmelze zu dev

Der Grund dafür ist, dass Anfang und Ende nicht übereinstimmen - es ist etwas schwieriger zu verstehen, was dies ist und war. Nicht unmöglich, aber es dauert ein bisschen länger, bis jemand seine Rolle versteht.

Wenn dies jedoch eine neue Funktion ist, die von Code abhängt, der noch nicht in dev gefunden wurde, sollte der Ablauf folgendermaßen aussehen:

  1. zweig von dev
  2. Von erforderlicher Funktion zusammenführen
  3. Code bearbeiten
  4. Von dev zusammenführen, sobald die erforderliche Funktion abgeschlossen ist
  5. Überprüfen Sie die Funktionalität (und zusätzliche Commits) im Feature-Zweig
  6. verschmelze zu dev

Beachten Sie, dass dies mit einer Verzweigung von dev beginnt und mit einer Zusammenführung zu dev endet.

Alles, was gesagt wird, ist wahrscheinlich das Beste, das Zusammenführen von einem Feature zu einem anderen Feature zu vermeiden. Verzweigen Sie die Funktion, führen Sie alle erforderlichen Vorbereitungen durch ... und warten Sie.

  1. zweig von dev
  2. Code bearbeiten
  3. Von dev zusammenführen, sobald die erforderliche Funktion abgeschlossen ist
  4. Überprüfen Sie die Funktionalität (und zusätzliche Commits) im Feature-Zweig
  5. verschmelze zu dev

Dies bietet die stabilsten Verzweigungen und den stabilsten Code.

Für die zukünftige Arbeit sollte eine Funktion zum Veröffentlichen der für die Interoperabilität mit anderen Funktionen erforderlichen Schnittstellen in Betracht gezogen werden - auch wenn der Implementierungscode nicht vollständig ist. Dies würde zu dev zusammengeführt, und das erforderliche Feature könnte dann von diesen Schnittstellen abarbeiten, ebenso wie das zukünftige Feature. Dies würde wahrscheinlich dazu führen, dass das zukünftige Feature weitere Fortschritte erzielt (Codierung anhand der Schnittstellen, Testen anhand von Stubbs, die die Schnittstellen implementieren), als wenn es warten müsste, bis das erforderliche Feature zu dev zusammengeführt wird.


quelle
In Ihrer dritten Gruppe von Schritten besteht der Nachteil darin, dass Schritt 1 ein "Dummy-Commit" enthalten muss. In meiner Situation habe ich nichts Nützliches zu begehen, bis required-featurees eingearbeitet ist.
Borek Bernard
Ich verweise immer noch auf einen meiner Lieblingsartikel zum Thema Verzweigung: Advanced SCM Branching Strategies . Während das Hauptaugenmerk auf einem zentralen Versionskontrollsystem liegt, sind die Vorstellungen der Rollen, die es präsentiert, genau auf Git-Flow abgestimmt .
Und was das Dummy-Commit betrifft, so ist der letzte Absatz da. Was nützlich gewesen wäre, ist eine Funktion, die ausgeführt und vervollständigt wurde als "Schnittstellen zum Ausführen von Dingen". Dann könnten sowohl die erforderlichen als auch die zukünftigen Funktionen dieser Schnittstellen funktionieren. Während Required-Feature an der Implementierung der Interfaces arbeitete, konnte Future-Feature sie herausfiltern und Tests gegen sie durchführen - und darauf warten, dass Required-Feature zu Dev zusammengeführt wurde.
Fragen Sie sich, wie schlecht Ihre zweiten Schritte sind. Ist es in der Praxis ein Problem, dass ein Zweig nicht den gleichen Anfang und das gleiche Ende hat? Ich denke nicht, dass es mich zu sehr stören würde, aber vielleicht ist es ein großer Chaosfaktor?
Borek Bernard
Es geht darum, durch den Zweig klar zu beschreiben, den Verlauf festzuschreiben und zusammenzuführen, welcher Zweig der übergeordnete Zweig ist. Innerhalb von Git-Flow sollten Sie das in den Verzweigungen der Git-Flow-Funktionen beschriebene System befolgen . Der Feature-Zweig verzweigt sich zum Entwicklungszweig und wird zum Entwicklungszweig zusammengeführt. Wenn Sie von anderen Feature-Zweigen aus verzweigen, wird die Rolle dieses Zweigs weniger klar. Ich würde Sie ermutigen, zu warten, bis das erforderliche Feature fertig ist, wenn Sie den Code jetzt nicht ohne ihn bearbeiten können.
1

Ein Feature-Zweig gilt normalerweise als weniger stabil als der Stamm (Entwickeln / Mastern), sodass Sie möglicherweise mehr zugrunde liegenden Änderungen unterliegen als normal, wenn Sie Ihre Arbeit auf einem Zweig aufbauen.

Auch wenn der Zweig normalerweise verpönt ist, wenn er verschoben wurde, ist es nicht ungewöhnlich, Feature-Zweige auf den übergeordneten Zweig zu verlagern, um eine schönere Historie zu erhalten. Dies wäre jedoch besonders kompliziert, wenn zusätzliche Zweige daran hängen würden im Wesentlichen eine neue Einschränkung für den übergeordneten Zweigstellenbesitzer sowie potenzielle Kopfschmerzen für sich selbst erstellen.

Das heißt, es gibt keine strenge Regel dagegen. Dies sind schließlich nur Muster und Best Practices.

Bearbeiten: Verpasster Teil Ihrer Frage. Durch das Zusammenführen des Feature-Zweigs zu einem eigenen Zweig, der auf dem Master basiert, werden die oben genannten Probleme nicht wirklich vermieden, und es kann sogar eine noch komplexere Geschichte erstellt werden.

Wenn ich also in Ihren Schuhen stecke und die Arbeit verschieben könnte, bis ein Feature fertig ist, oder zuerst etwas anderes tun würde, würde ich das tun.

axl
quelle