てくてくテック☆

千里の道も一歩から。テック(Tech)の道をてくてく歩く。

Git で作業中のブランチに他ブランチの特定の commit を反映する

これから作業予定のブランチで master に取り込まれ待ちの別ブランチの commit の内容が必要だったので、その commit をこれから作業予定のブランチにも持ってくることにしました。
 

今の状況

master に取り込まれ待ちの別ブランチが 【ブランチ A】 で、これから作業予定のブランチが 【ブランチ B】 です。
 

ブランチ A (master から作成)

フォルダ X とその配下にファイル A を作成して commit 済み
master に push し、取り込み待ちの状態
(ブランチ A の commit はゆくゆく master に merge されることは確定済み)
 

ブランチ B (master から作成)

フォルダ X の下にファイル B を作成して commit したい
でも、master にブランチ A の commit がまだ取り込まれていないので、ブランチ B 作成時点ではフォルダ X がない
かといってブランチ B でもフォルダ X を作ると、master に merge するときにコンフリクトを起こすはず。。
そのときは手動で merge すればいいだけの話だけど、なんとなく嫌だ!
 

cherry-pick コマンドでブランチ B にブランチ A の特定の commit を反映する

調べてみたら、こういうときは cherri-pick コマンドが使えるとわかったので、早速お試し。
以下、手順です。
 

ブランチ A の commit ID を調べる

これから作業予定のブランチ(ブランチ B)に持っていきたい別ブランチ(ブランチ A)の commit の commit ID を調べます。

$ git checkout branch-a
$ git log
commit 1234567890abcdefghij1234567890abcdefghij
Author: hogehoge <hogehoge@mail.com>
Date:   Wed Nov 1 12:34:56 2017 +0900

    add file-a.md

上記の 1234567890abcdefghij1234567890abcdefghij の部分をコピーしておきます。
 

ブランチ B にブランチ A の commit を反映する

これから作業予定のブランチ(ブランチ B)に切り替え、先ほど調べた commit ID を使って、cherry-pick コマンドを実行します。

$ git checkout branch-b
$ git cherry-pick 1234567890abcdefghij1234567890abcdefghij

これでブランチ B にブランチ A の commit 内容が適用されます。簡単!
あとは master に取り込まれるときに問題ないことが分かればバッチリ。
 


今回は cherry-pick コマンドを使ってみたけど、他にも方法があったりするのかなー??

もし、もっといい方法が見つかったら、また追記しようと思います。
 

2017/11/07 追記:

コンフリクトなどの問題が起きることなく、無事に master に取り込まれることを確認!

ちなみに、特定の commit ではなく、ブランチまるごと反映させたい場合は以下のコマンドでできます。
(ブランチ A をブランチ B に反映させてます)

$ git pull origin branch-a:branch-b

こちらの方法でも問題なく、master に取り込まれるのを確認済みです。