Mercurial git(私が日常的に使用し、使用している2つのDVC)などの分散バージョン管理システムでの分岐に関するベストプラクティスについて多くのことを考えてきました。
これまでのやり方は少しずつ異なりますが、一般的には次のガイドラインに従います。
開発は機能ブランチで行われ(通常はマスターブランチから作成されるため、安定したコードベースで作業していることがわかります)、開発が完了し、レビューされ、開発者がテストすると、開発にプッシュ/マージされます。/betaブランチ、ベータサーバーに配置、テスト。
すべてがうまくいけば、機能は承認され、master/stableブランチにマージして、ステージングし、最終テストを行って、本番環境に導入できます。
それでもうまくいかない場合は、故障します。たとえば、機能が破棄されたり、無期限に遅延したりする場合は、おそらくdev/betaブランチから削除する必要があります。ただし、master/stableからのマージ(修正プログラム、コンテンツの変更など)、およびその他の新機能がdevブランチに配置されている可能性があるため、そのブランチから単一の機能を削除することが困難になります。
私はこのワークフローが壊れているという結論に達していますが、うまくいくようです。したがって、具体的には:
そしてより一般的には:
基本的にワークフローは問題なく、基本的にここに提示されたアイデアに従っていると思います: 成功したGit分岐モデル 。しかし、それが失敗する理由は、マージとテストのプロセスで本質的に「1つずつ」離れているためです。
機能がまだ開発にマージされていない別の機能に依存している場合、事態は間違いなく少し複雑になりますが、Doc Brownが answer で述べたように、ここでは「機能の切り替え」が良いアイデアだと思います。ほぼ完成した機能は開発に統合されていますが、本番環境では使用できません。依存する機能は、開発の上にリベースされ、準備ができたらマージされます。
ほとんどのVCS(またはDVCS)では、マージ後にすでに統合されている機能を削除するのは難しいと思います。そのため、この状況が発生することはできるだけありません。いくつかのアイデア:
承認がかかっている機能がある場合(たとえば、「正しい」ものを作成していることを確認する前に、まずユーザビリティテストが必要です)、テスターがそのユーザビリティテストを、機能ブランチ、before開発ブランチに統合します。そのため、機能が危機に瀕している場合は統合を回避できます
私の経験では、小さな機能スライスは大きなものよりも廃棄や遅延のリスクが低くなります。なぜなら、生産をより簡単かつ迅速に行えるからです。したがって、機能スライスをできるだけ小さくするために一生懸命にしてください。
ダース(またはそれ以上)の機能スライスで構成されるより複雑な機能があり、最終的なユーザーにその複雑な機能をオールオアナッシングとしてのみ表示したい場合は、 feature toggles を導入しますコードを作成し、全体ではなく、スライスごとに機能ブランチを使用します。これにより、後で機能コードを「アンマージ」することが実際に簡単になるわけではありませんが、たとえば、機能スライスの半分をdevブランチに統合した後で、次のリリースですべてを完了しないことを決定した場合、機能トグルをアクティブ化せずに、完成した機能スライスをdevブランチに残します。したがって、ユーザーはそこに半分完成した機能があることに気付かないでしょう。
編集:機能の一部がdevブランチに統合され、他のチェンジセットと混同された時点で機能を「解体」する必要が本当に生じた場合、別の機能ブランチを使用するオプションがあります(または私は「機能のようなブランチ」と言うべきですか?)そのタスクのために。そのブランチ内のコードの関連部分を変更または削除し、開発者がテストしてから、その変更セットをdevブランチに再度統合します。
EDIT2:機能の切り替えの詳細については、 Martin Fowlerのこのブログ投稿 を参照してください。