web-dev-qa-db-ja.com

機能ブランチ、ベータブランチ、および廃棄された機能

Mercurial git(私が日常的に使用し、使用している2つのDVC)などの分散バージョン管理システムでの分岐に関するベストプラクティスについて多くのことを考えてきました。

これまでのやり方は少しずつ異なりますが、一般的には次のガイドラインに従います。

  • マスターブランチ-製品コードと同時に
  • 開発ブランチ-「ベータ」コードと同時に
  • 機能ブランチ-機能開発用

開発は機能ブランチで行われ(通常はマスターブランチから作成されるため、安定したコードベースで作業していることがわかります)、開発が完了し、レビューされ、開発者がテストすると、開発にプッシュ/マージされます。/betaブランチ、ベータサーバーに配置、テスト。

すべてがうまくいけば、機能は承認され、master/stableブランチにマージして、ステージングし、最終テストを行って、本番環境に導入できます。

それでもうまくいかない場合は、故障します。たとえば、機能が破棄されたり、無期限に遅延したりする場合は、おそらくdev/betaブランチから削除する必要があります。ただし、master/stableからのマージ(修正プログラム、コンテンツの変更など)、およびその他の新機能がdevブランチに配置されている可能性があるため、そのブランチから単一の機能を削除することが困難になります。

私はこのワークフローが壊れているという結論に達していますが、うまくいくようです。したがって、具体的には:

  • このタイプのブランチから特定の機能を削除することは可能ですか?
  • これは壊れたワークフローですか?

そしてより一般的には:

  • 機能の長期的な開発と、ブランチをライブと同時に実行する必要がある場合、DVCに含まれるベストプラクティスは何ですか?
7
Ryan Kinal

基本的にワークフローは問題なく、基本的にここに提示されたアイデアに従っていると思います: 成功したGit分岐モデル 。しかし、それが失敗する理由は、マージとテストのプロセスで本質的に「1つずつ」離れているためです。

  • 機能ブランチは、stable/masterブランチではなく、開発ブランチに基づいている必要があります。長期的な機能は、開発ブランチの上に継続的にリベースされています。
  • 機能ブランチは、次のリリースの準備ができて承認されたときにのみ開発ブランチにマージする必要があります(つまり、マージすると、次のリリースに確実に移行します)。
  • 新しいリリースを準備するとき、リリースブランチは開発ブランチから作成され、本番環境の安定版/マスターブランチにマージされる前に最終テストが行​​われます。

機能がまだ開発にマージされていない別の機能に依存している場合、事態は間違いなく少し複雑になりますが、Doc Brownが answer で述べたように、ここでは「機能の切り替え」が良いアイデアだと思います。ほぼ完成した機能は開発に統合されていますが、本番環境では使用できません。依存する機能は、開発の上にリベースされ、準備ができたらマージされます。

5
Oskar N.

ほとんどのVCS(またはDVCS)では、マージ後にすでに統合されている機能を削除するのは難しいと思います。そのため、この状況が発生することはできるだけありません。いくつかのアイデア:

  • 承認がかかっている機能がある場合(たとえば、「正しい」ものを作成していることを確認する前に、まずユーザビリティテストが必要です)、テスターがそのユーザビリティテストを、機能ブランチ、before開発ブランチに統合します。そのため、機能が危機に瀕している場合は統合を回避できます

  • 私の経験では、小さな機能スライスは大きなものよりも廃棄や遅延のリスクが低くなります。なぜなら、生産をより簡単かつ迅速に行えるからです。したがって、機能スライスをできるだけ小さくするために一生懸命にしてください。

  • ダース(またはそれ以上)の機能スライスで構成されるより複雑な機能があり、最終的なユーザーにその複雑な機能をオールオアナッシングとしてのみ表示したい場合は、 feature toggles を導入しますコードを作成し、全体ではなく、スライスごとに機能ブランチを使用します。これにより、後で機能コードを「アンマージ」することが実際に簡単になるわけではありませんが、たとえば、機能スライスの半分をdevブランチに統合した後で、次のリリースですべてを完了しないことを決定した場合、機能トグルをアクティブ化せずに、完成した機能スライスをdevブランチに残します。したがって、ユーザーはそこに半分完成した機能があることに気付かないでしょう。

編集:機能の一部がdevブランチに統合され、他のチェンジセットと混同された時点で機能を「解体」する必要が本当に生じた場合、別の機能ブランチを使用するオプションがあります(または私は「機能のようなブランチ」と言うべきですか?)そのタスクのために。そのブランチ内のコードの関連部分を変更または削除し、開発者がテストしてから、その変更セットをdevブランチに再度統合します。

EDIT2:機能の切り替えの詳細については、 Martin Fowlerのこのブログ投稿 を参照してください。

4
Doc Brown