

Git(GitHub)で、以下の様なリモートブランチで作業していたとします。

master  
\--develop  
\--branchA  
\--branchB  
\--branchC

通常の運用では、各ブランチの開発が終わったらdevelopにマージし、ステージングで確認した後にmasterにマージして本番リリースとなりますが、以下の様な状況が発生した場合、どうするのが効率的でしょうか。

  * branchCだけを再優先でリリースしなければならなくなった
  * 既にbranchAはdevelopにマージ済みだが、ステージングで未確認のため本番リリースはできない
  * branchBはリモートにPush済かつPullRequest発行済でレビュー中のため、まだdevelopにはマージしていない

branchCをリリースするためにbranchAの確認を急いでbranchAとCを同時にリリースする、と言うのはナシで、あくまで先にbranchCのみリリースしたいです。

また、例のようにマージ済みのブランチが1つだけならまだいいですが、実際は複数あります。

何かいい方法があったら教えていただけますでしょうか。  
よろしくお願いします。

※Gitの仕組みをキチンと理解してないで無謀なことを言ってしまえば、branchCの親をdevelopからmasterに変えてしまうようなことができれば、hotfix的に扱えて理想的なんですが…(^-^;


CC BY-SA 3.0
2016-03-30T03:03:30.273
23606
2016-10-15T03:17:34.310
2016-10-15T03:17:34.310
754
14981
question
git git-flow
branchの運用について


develop/master/topic ブランチの概念を持ち出しているということは、 [git
flow](http://danielkummer.github.io/git-flow-cheatsheet/)
のワークフローを想定しているのだと思います。

branchC を HotFix 扱いして、 master へマージしてはどうでしょうか。

* * *

git flow 的に HotFix 扱いするのなら、具体的な作業は次のようになるかと思います。

  * branchC を develop ではなく、 master から派生させる形で rebase する。  
(`git rebase --onto` などが使えるかと)

  * master--branchC の形にしてから、 master へマージする。
  * 新たな master を HotFix としてリリースする
  * (develop が置いていかれてるので) branchC を develop にマージする


CC BY-SA 3.0
2016-03-30T03:11:24.480
23607
2016-04-01T05:32:38.383
2016-04-01T05:32:38.383
754
754
23606
answer


Gitにおいてブランチの親子関係は管理されていません。基本的にどこかで分岐した2つのブランチは互いにマージが可能ですから、branchCをmasterにマージすることはできます。ただこの場合、masterとbranchCが分岐した時点からbranchCまでの修正が全てmasterに適用されることになるので、

  1. （前回のdevelop→masterのマージ）
  2. developからbranchXを切り出し
  3. branchXの実装が終わったのでdevelopにマージ
  4. developからbranchA,B,Cを切り出し
  5. branchAをdevelopにマージ
  6. （branchCの変更だけをmasterに適用したい！！）

このような場合、branchCを切り出した後にマージされたbranchAが巻き込まれることはありませんが、切り出す前にマージされていたbranchXは既にbranchCの歴史の一部になっているため、一緒にmasterにマージされてしまいます。

これを避けるには、「masterに対してbranchCの変更だけを含む」コミットを作成する必要があります。

例えば `git rebase --onto`
を使うと、developとbranchCが分岐した時点から現在のbranchCまでの各コミットを、masterを起点に作成しなおすといった作業が行えます。

  * [実践 git rebase --onto - あらびき日記](http://d.hatena.ne.jp/a_bicky/20130210/1360504520)
  * [Git - リベース](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9#%E3%81%95%E3%82%89%E3%81%AB%E8%88%88%E5%91%B3%E6%B7%B1%E3%81%84%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9)

単純なrebaseと同様に、現在のbranchCは失われますから、作業を始める時点のbranchCにtagを打つなり、リポジトリのバックアップを取るなりしておき、何かあった場合に戻せるようにしておくとよいでしょう。


CC BY-SA 3.0
2016-03-30T07:20:07.227
23617
2016-03-30T07:20:07.227
8000
23606
answer


branchAのマージコミットをrevertし、branchCをマージするのはいかがでしょうか。

branchCのマージ後、revert branchAを行ったコミットをrevertすることを忘れなければ、目的を達成できるかと思います。


CC BY-SA 3.0
2016-03-31T11:17:34.337
23657
2016-03-31T11:17:34.337
14973
23606
answer