Sepertinya Anda memiliki beberapa masalah di sini:
1. Mengidentifikasi fitur untuk rilis tertentu
Ini adalah masalah manajemen proyek, dan masalah koordinasi. Apakah fitur ini akan dirilis sebelum, bersamaan dengan, atau setelah fitur lainnya ini? Jika rilis ingin terjadi satu fitur pada suatu waktu, maka identifikasi itu. Jika fitur akan dikelompokkan menjadi rilis, maka cari tahu apa pengelompokan itu, dan menegakkannya dengan para dev dan pembuat keputusan. Gunakan sistem pelacakan atau tiket Anda untuk menandai rilis. Jelaskan bahwa jika satu fitur dari rilis spesifik adalah no-go, maka semuanya adalah.
2. Strategi percabangan
Git-flow adalah jawaban yang mudah untuk masalah seperti ini, dan sering orang menggunakan varian git-flow bahkan jika mereka tidak tahu apa itu. Saya tidak akan mengatakan bahwa itu adalah masalah untuk semua masalah, tetapi itu sangat membantu.
Sepertinya Anda mengalami masalah dengan strategi rilis non-deterministik, di mana fitur disetujui scattershot dan sesuatu yang memulai pengembangan sejak lama mungkin akan dirilis setelah sesuatu yang dimulai baru-baru ini - fitur lompatan-katak.
Cabang fitur yang berumur panjang atau cabang rilis simultan mungkin merupakan jawaban terbaik untuk masalah seperti ini. Gabungkan (atau rebase, jika Anda nyaman dengan itu) yang terbaru dari master ke cabang Anda yang sudah berjalan lama. Berhati-hatilah untuk hanya menggabungkan fitur yang sudah hidup, jika tidak Anda akan mengalami masalah yang Anda alami sekarang (terlalu banyak fitur yang tercampur pada satu cabang).
Cabang "Perbaikan terbaru" atau "perbaikan bug" adalah bagian penting dari proses ini; menggunakannya untuk perbaikan kecil satu kali yang memiliki siklus QA pendek.
Dari uraian Anda, mungkin bahkan lebih baik untuk tidak mempertahankan cabang 'pengembangan' resmi. Sebaliknya, cabut semua fitur dari master, dan buat cabang rilis gabungan setelah rilis diidentifikasi.
3. Lingkungan
Jangan mencocokkan cabang git dengan lingkungan Anda, kecuali untuk master produksi ==. Cabang 'pengembangan' harus dianggap rusak. Cabang pelepas didorong untuk menguji lingkungan, apakah itu lingkungan QA atau pementasan envirement. Jika perlu, dorong cabang fitur tertentu ke lingkungan.
Jika Anda memiliki lebih dari satu cabang fitur yang perlu dirilis secara terpisah tetapi sedang diuji pada saat yang sama ..... ¯ \ _ (ツ) _ / ¯ .... putar server lain? Mungkin menggabungkan mereka menjadi cabang yang dibuang ... melakukan perbaikan / perubahan ke cabang yang asli dan menggabungkan kembali ke cabang yang dibuang; lakukan persetujuan akhir dan UAT pada cabang rilis individu.
4. Menghapus fitur yang tidak disetujui dari cabang
Inilah yang coba dihindari oleh pikiran-pikiran di atas, karena ini tanpa ragu adalah hal yang paling menyakitkan untuk dicoba dan dilakukan. Jika Anda beruntung, fitur telah digabungkan ke dalam pengembangan Anda atau menguji cabang secara atomik menggunakan gabungan komitmen. Jika Anda kurang beruntung, para pengembang telah berkomitmen langsung ke cabang pengembangan / pengujian.
Either way, jika Anda mempersiapkan untuk rilis dan memiliki perubahan yang tidak disetujui, Anda harus menggunakan Git untuk mendukung komitmen yang tidak disetujui dari cabang rilis; ide terbaik adalah melakukannya sebelum menguji rilis.
Semoga berhasil.