ここにいくつかの問題があるようです。
1.特定のリリースの機能を識別する
これはプロジェクト管理の問題であり、調整の問題です。ウィルこの機能は、同じ時間に、前にリリースされ、またはこの後のこと、他の機能は?リリースが一度に1つの機能を実行したい場合は、それを特定します。機能をリリースにグループ化する場合は、グループ化が何であるかを把握し、開発者と意思決定者に適用します。問題追跡システムまたはチケットシステムを使用して、リリースにタグを付けます。特定のリリースの1つの機能がノーゴーである場合は、すべての機能がノーゴーであることを明確にしてください。
2.分岐戦略
Git-flowはこれらのような問題に対する簡単な答えであり、多くの場合、人々はそれが何であるかを知らなくてもgit-flowのバリアントを使用します。すべての問題に対応できるとは言いませんが、大いに役立ちます。
機能が承認されたスキャッターショットであり、以前に開発を開始したものが最近開始されたもの-跳躍カエル機能の後にリリースされる可能性がある非決定的リリース戦略の問題に直面しているようです。
長期にわたる機能ブランチまたは同時リリースブランチは、おそらくこの種の問題に対する最善の答えです。masterから最新のブランチを長期実行ブランチにマージします(または、使い慣れている場合はリベースします)。すでに公開されている機能のみをマージするように注意してください。そうしないと、これまでに発生していた問題(1つのブランチに多すぎる機能が混在している)に遭遇します。
「Hotfix」または「bugfix」ブランチは、このプロセスの重要な部分です。QAサイクルが短い小さな一時的な修正に使用します。
あなたの説明から、公式の「開発」ブランチを維持しないほうが良いかもしれません。むしろ、すべての機能をマスターから分岐し、リリースが識別されたらマージされたリリース分岐を作成します。
3.環境
production == masterを除き、gitブランチを環境に合わせないでください。「開発」ブランチは破損していると想定する必要があります。リリースブランチは、QA環境であろうとステージング環境であろうと、テスト環境にプッシュされます。必要に応じて、特定の機能ブランチを環境にプッシュします。
個別にリリースする必要があるが、同時にテストされている機能ブランチが複数ある場合.....¯\ _(ツ)_ /¯....別のサーバーを起動しますか?たぶんそれらを一緒にスローアウェイブランチにマージしてください...元のブランチに修正/変更をコミットし、スローアウェイブランチに再マージしてください。個々のリリースブランチで最終承認とUATを行います。
4.承認されていない機能をブランチから削除する
これは、上記の考えが回避しようとしていることです。なぜなら、これは間違いなく試してやるべき最も苦痛なことだからです。運が良ければ、マージコミットを使用して、機能が開発ブランチまたはテストブランチにアトミックにマージされています。運が悪い場合、開発者は開発/テストブランチに直接コミットしています。
いずれにせよ、リリースの準備をしていて、承認されていない変更がある場合、Gitを使用して、承認されていないコミットをリリースブランチからバックアウトする必要があります。リリースをテストする前にそれを行うのが最善のアイデアです。
幸運を祈ります。