私たちのチームでは、次のように取り組んでいます。
- GitHub リポジトリにはブランチしかあり
master
ません。安定していません。毎日そこにプッシュされると思います。安定版リリースにはタグを使用します (開発には GitHub のプライベート フォークを使用します) - 3 週間ごとに、バグ修正と新機能 (1.2.4、1.2.5、1.2.6 など) を含む新しいマイナー バージョンをリリースします。
- また、マイナーな旧バージョンを一定期間 (数か月) 維持する必要があるため、誰かが 1.2.4 を使用し、最新バージョンが 1.2.7 であるときにバグを見つけた場合、バグの修正を要求することができます。彼らが使用するブランチで。その後、パッチ バージョン1.2.4A をリリースします。
- パッチはかなり例外的です。通常、マイナー リリースには 1 ~ 2 個のパッチしか適用しません。ほとんどのリリースでは、パッチは行いません。
問題は、マスターと古いブランチのバグを同時に修正するための最善の戦略は何ですか?
主な戦略として次の 2 つが考えられます。
でバグを修正し、次に
master
checkoutしてから、適切なコミットを選択し (バグ修正が常に保持される 1 つのコミットであると仮定します)、結果のコミットに としてタグを付けます。v1.2.4
v1.2.4A
をチェックアウト
v1.2.4
し、バグを修正してコミットし、コミットに としてタグを付け、v1.2.4A
に組み込むにmaster
は、マージを行います。
私はどちらかというと最初のバージョン(いいとこ取り)に賛成ですが、賛否両論について他の方のコメントを聞きたいです。
もちろん、途中のコミットがいくつかの大きな変更を導入し、1.2.4 とマスターの両方で機能するコミットを作成できないという事実につながると、事態は複雑になる可能性があります(たとえば、関数名が変更された場合)。またはより複雑なもの)。しかし、より一般的な状況は、問題なく修正を移植できるということです。
マスターからチェリー ピッキングを行う利点:
歴史はチェリーピッキングでより「食べられる」と思います。このことを考慮:
| <- bugfix done on master | | | <- v1.2.7 ... | | | | | | | | | | - <- v.1.2.4A (cherry-picked from master) | / | <- v1.2.4
対これ:
| <- bugfix merged to master |\ | \ | | | | <- v1.2.7 ... | | | | | | | | | | | | | | | | | | | - <- v.1.2.4A (direct bugfix) | / | <- v1.2.4
間に何十ものコミットがあると考えてください。このように複数のパッチを並行して適用することを検討してください。画面の半分が汚れます。
で問題を修正したとします
v1.2.4
が、数日後に でのパッチを求める人がいますv1.2.3
。チェリーピックは最も賢明な方法です。
私が見落としていた私たちの場合、マージの利点はありますか? チェリーピッキングよりも 2 つのコミット間の接続を維持するほうがよいことは理解できますが、リリースのドキュメントを保持しており、これらすべてもそこで追跡されています。