これは難しい問題ですが、多くの人が直面する問題です。開始点としてGitflowセットアップを使用することを好みます。
開発->
マスターで作業中の新しいもの->テストが必要な完成したもの生産->生産に公開されたもの。
マイナー(より短い)機能では、開発からブランチを作成し、そこで作業を行い、ブランチを開発にマージします。
主要な(長期)機能では、開発からブランチを作成し、そのブランチから小さなブランチを作成してから、最初のブランチにマージします。主要な機能が完成したら、開発ブランチに戻ります。
定期的に(プロジェクトによって異なります)、開発をマスターにマージし、テストサイクルを開始します。テストで修正が行われた場合、それらはマスターブランチで行われます(サブブランチがマージされます)。また、テスト中にmasterブランチで開発を継続できます。
マスターはいつでも開発にマージする必要があり、開発はその長期サブブランチのいずれかにマージする必要があります。
マスターは常に(理論上)生産の準備ができている必要があります。開発は常に(理論上)生産の準備ができている必要があります。唯一の理由は、テスターがテストするための堅牢な機能セットを提供することです。
準備ができたら、テストされたマスターでのコミットが本番環境にマージされ、本番環境での展開がそのブランチから行われます。緊急時に行う必要のあるHOTFIXは、マスター(多くの未テストの変更がある可能性があります)にマージすることなく、実稼働ブランチで実行できます。
私の通常のツリーは次のようになります
LongTerm -> Development -> Master -> Production
LongTerm <- Development | |
| Development -> Master |
LongTerm <- Development -> Master |
Development <- Master |
Master -> Production
私の一般的なルールでは、単一の変更に数時間以上かかることはありません。その場合は、より小さな変更を加える必要があります。それが巨大な機能(UIの書き換えなど)である場合は、通常の開発を同時に継続できるように、長期にわたって行われます。LongTermブランチは通常ローカルブランチのみですが、Development、Master、およびProductionはリモートブランチです。サブブランチもローカルのみです。これにより、長期の機能セットでのgitの有用性を失うことなく、他の人のためにリポジトリをクリーンに保ちます。
ただし、長期ブランチの存在はまれなことです。通常、私の仕事はすべて開発中です。時間がかかりそうな機能(セット)があり、通常の開発スタッフでも作業できるようにする必要がある場合にのみ、LongTermブランチを使用します。一緒にすべき変更のセットだけである場合は、すべてが完了するまでマスターにマージしません。