GitHubフローでは、機能ブランチを別の機能ブランチに基づいてもかまいませんか?


22

私たちはプロジェクトでGitHub Flowを使用し、ほとんどの場合、masterから新しい機能ブランチを開き、そこで作業を行い、PRを開き、コードを確認してmasterにマージします。

しかし、私の現在の仕事はで取り組んでいる別の問題に依存していfeature-branch-Aます。他のブランチからブランチ作成するのはコーシャーですか、それともGitHub Flowの精神に反するものですか?

別の方法は、私のブランチをマスターに基づいて、feature-branch-A(頻繁に)変更をマージすることです。

GitHubフローではどのオプションが推奨されますか?

回答:


24

機能分岐から分岐するときに従うワークフローは次のとおりです。

  1. feature-branch-Bから作成feature-branch-A
  2. に取り組む feature-branch-B
  3. より多くのコミットが追加されている場合はfeature-branch-A分岐後、リベースfeature-branch-Bfeature-branch-A
  4. 作業を終了しfeature-branch-Bfeature-branch-Aがにマージされるまで待ちmasterます。
  5. feature-branch-Aにマージされmasterリベース、feature-branch-B上にmaster
  6. feature-branch-B統合master

上記のワークフローに従うと、マージmasterfeature-branch-Aに分岐したように見えます。feature-branch-Aが統合されるまで作業を開始するまで待つ必要はありませんfeature-branch-B。それでも、複雑なツリーがなくても、クリーンな履歴を取得できます。


これはまさに私が探していた答えでした!あなたはそれを整理するという頭痛の種を救ってくれました、ありがとう!
ヴァンスパラシオ

既に公開されているコミットをリベースしないでください... daolf.com/posts/git-series-part-2
Sebi2020

8

別の機能で機能を作成する場合、これはまったく問題ないと思います。

しかし、頻繁にそれをしないでください。これを作成した1人の開発者と、1、2週間でマージのために10個のPRを投げるのを見ます。他のメンバーはレビューのために完全に疲れ果て、マージも困難でした。gitで木を作らないでください。これは、エラーを見つけるための二分法に役立ちます。


7

git-flowが対処することを意図した重要なことは、特定のブランチの役割、およびブランチの分岐元とマージ先について推論する能力でした。

理想的には、すべてのブランチはマージ元のコードラインにマージされます。これは通常、メインラインからのマージです(git-flowではdev)。機能ブランチはdevから分岐してマージし、リリースブランチはdevからブランチしてマージします(への追加マージを使用master)。マスターからのブランチとマージのホットフィックス(devへの追加のマージ)。

各コードラインは、その親から分岐し、親にマージします。コードラインは、必要に応じて、いつでも他のコードラインからコードを取り込むことができます。

機能ブランチからのブランチが「その機能ブランチの問題を修正するこの方法を探求したい」場合-まったく問題ありません。機能ブランチから分岐し、一部のコードをコミットして、機能ブランチにマージします(または破棄します)。

  1. 機能から分岐
  2. アイデアを探る
  3. 機能にマージ

ただし、避けたいのは次のようなものです。

  1. 必須機能からの分岐
  2. コードに取り組む
  3. required-featureが完了したら、devからマージします
  4. 機能ブランチの機能(および追加のコミット)を検証する
  5. 開発者にマージ

理由は、開始と終了が一致しないためです-これが何であったかを理解するのが少し難しくなります。不可能ではありませんが、誰かがその役割を理解するのに少し時間がかかるだけです。

ただし、これがdevにまだないコードに依存する新しい機能である場合、フローは次のようになります。

  1. 開発者からの分岐
  2. required-featureからマージ
  3. コードに取り組む
  4. required-featureが完了したら、devからマージします
  5. 機能ブランチの機能(および追加のコミット)を検証する
  6. 開発者にマージ

これはdevからのブランチで始まり、devへのマージで終わることに注意してください。

とはいえ、おそらく最善の方法は、ある機能から別の機能へのマージを避けることです。機能を分岐させ、必要な準備をして...待ってください。

  1. 開発者からの分岐
  2. コードに取り組む
  3. required-featureが完了したら、devからマージします
  4. 機能ブランチの機能(および追加のコミット)を検証する
  5. 開発者にマージ

これにより、最も安定したブランチとコードのセットが提供されます。

将来の作業のために考慮すべきことは、実装コードが完全ではない場合でも、他の機能との相互運用性に必要なインターフェースを公開する機能を持つことです。これはdevにマージされ、その後、required-featureは、future-featureと同様に、これらのインターフェースで機能します。これにより、必要な機能がdevにマージされるのを待たなければならない場合よりも、将来の機能をさらに進めることができます(インターフェイスに対するコーディング、インターフェイスを実装するスタブに対するテスト)。


3番目のステップセットでは、ステップ1に「ダミーコミット」を含める必要があるという欠点があります。私の状況では、私がするまでコミットするために有用な何も持っていないrequired-featureISがで合併を。
ボレックバーナード

私は今でも、分岐に関する私のお気に入りの記事の1つであるAdvanced SCM Branching Strategiesとしてそれを指摘しています。一元化されたバージョン管理システムに焦点を当てていますが、それが示す役割のアイデアはgit-flowに正確に対応しています。

そして、ダミーのコミットに関しては、それがその最後の段落がある理由です。役に立つはずだったのは、「何かをするためのインターフェースを提供する」として実行され、完了した機能です。その後、必要な機能と将来の機能の両方がこれらのインターフェースで機能します。required-featureはインターフェースの実装に取り​​組みましたが、future-featureはそれらをスタブしてテストすることができます-required-featureがdevにマージされるのを待ちます。

2番目のステップセットがどれほど悪いか疑問に思います。実際には、ブランチに「同じ」開始と終了がないという問題はありますか?私はそれがあまり私を悩ませるとは思わないが、多分それは主要な混乱要因だろうか?
ボレックバーナード

どのブランチが親ブランチであるかについて、ブランチ、コミット、およびマージ履歴を通じて明確に説明することが重要です。git-flow内では、git flow機能ブランチで説明されているシステムに従う必要があります。機能ブランチは開発ブランチから分岐し、マージして開発に戻ります。他の機能ブランチからブランチを開始すると、そのブランチの役割が明確になりません。必要な機能が完了するまで待つ必要があります。これがないとコードを進められません。

1

機能ブランチは通常、トランク(開発/マスター)よりも安定性が低いと見なされます。そのため、作業ブランチをベースにすると、通常よりも多くの根本的な変更を受ける可能性があります。

また、ブランチがプッシュされた場合、通常は眉をひそめますが、機能ブランチを親ブランチにリベースして、より良い履歴を取得することは珍しくありませんが、追加のブランチがハングしている場合は非常に複雑になります基本的に、親ブランチの所有者に新しい制限を作成し、自分自身の頭痛の種を作成しています。

とはいえ、それに対する厳密なルールはありません。結局のところ、これらは単なるパターンであり、ベストプラクティスです。

編集:質問の一部を逃しました。機能ブランチを独自のものにマージしますが、これは上記の問題を実際に回避するものではなく、実際にはさらに複雑な履歴を作成する可能性があります。

したがって、もし私があなたの靴を履いていて、機能aが完了するまで仕事を延期できるか、または何か他のことを最初にやるなら、私はそれをするでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.