師走ですね。
皆様年末に向けて追い込みをかけている時期でしょうか?
開発が込み入ってくると、バージョン管理も複雑になって来ます。
例えば、サービスの運用をしていて複数の機能を実装していると、リリースのタイミングがズレるなんて事はないでしょうか?

そんな時にどのようにリリースすれば良いのか、私なりの方法で解説します。
手順や用語について
基本的にはgit-frowに乗っ取って進みます。
nvie.com
ページ内ではブランチ名を、英語表記で書きます。
それぞれ下記のような意味合いです。
| ブランチ名 | ページ内の日本語表記 |
|---|---|
| master | 本番用ブランチ |
| develop | 開発用ブランチ |
| release | 公開用ブランチ |
| hotfix | 緊急対応用ブランチ。masterブランチ |
| feature | 開発用ブランチ |
masterブランチへのマージ手順
relaseブランチに変更分をdevelopブランチから抽出して、masterブランチにマージします。
今回は、タグやプルリクエストについて触れませんが必要に応じて設定してください。
フローの説明
releaceブランチを切るdevelopブランチからreleaceに機能1で変更したファイルを抽出releaceブランチをmasterブランチにマージdevelopブランチにマージ
状況によっては、4番目の作業でコンフリクトを起こす可能性がありますので、適宜調整

もし、developブランチとmasterブランチが一致しているのであれば、
フローの1'のように、masterブランチからhotfixブランチの要領でreleaceブランチを切って良いかもしれません。
コマンドの解説
前項のフローを実行する時のコマンドについて触れます。
1. releaceブランチを切る
変更元のdevelopブランチからreleaceブランチを切ります。
$ git checkout develop
$ git branch -b release
2. developブランチからreleaceに機能1で変更したファイルを抽出
最終的なdevelopブランチからreleaceに機能1で変更したファイルをcheckoutします。
機能1のファイルだけ、developブランチから持ってきますので、下記のようにファイルの変更点を取得します。
$ git checkout develop (機能1で変更したファイル)
3. releaceブランチをmasterブランチにマージ
変更点を抽出したreleaceブランチをmasterブランチにマージします。
$ git checkout master $ git merge releace
4. developブランチにマージ
developブランチから直接マージした訳ではないので、developブランチにもマージします。
$ git checkout develop $ git merge releace
この方法の注意点と想定される対応方法
実装内容によっては機能間で処理の上書きをしており、一緒にリリースしないと処理が動かない場合もあります。
技術的な解決は難しい場合もありますので、例えば下記のような方法で回避できるのではないでしょうか。
hotfixで本番用に処理を修正する。
変更内容をdevelopブランチにマージした時にコンフリクトが起きるかもしれませんがdevelopブランチを公開する予定が立っているのであればdevelopブランチに合わせても良いかもしれません。- リリース時期の相談をする。
Tips
masterブランチからfeatureブランチを切り出す
もう一つの解決方法は、developブランチではなく、masterブランチからfeatureブランチを切り出して行く方法です。
マージ出来たら、developブランチにもマージします。
意味合い的にはmasterブランチから、featureブランチの要領でhotfixブランチを切って開発を進める方法です。
このフローのメリット、デメリットや見解が載っていますのでこちらも参考にされると良いかもしれません。
以上です。
もちろん、developブランチで機能確認が出来ている状態ですので、一部だけ切り取ってリリースすると新しい問題が発生する場合もあります。
そのままリリースを出来るようにスケジュールを立てるのは重要です。
ただ、どうしようもない時はありますのでこういった方法で対応する事も必要かもしれません。