やりたいこと
ブランチをそのままマージしたくはないけど、特定のコミットだけを取り込みたい。
cherry-pickを使ってみる。
結論
◆他ブランチから指定したコミットを取り込んだ後に、そのまま自ブランチにコミットしてよいとき
git cherry-pick [コミットID]
◆他ブランチから指定したコミットを取り込んだ後に、そのまま自ブランチにコミットしないとき
git cherry-pick -n [コミットID]
検証
検証の流れ
- featureAブランチとfeatureBブランチをを作成
- featureAブランチにのみコミットを繰り返して、ファイルの中身を変更
- fearuteBブランチに追加したいコミット履歴のみfeatureAからcherry-pickする
1. file1とfile2を作成する。(初期状態)
◆file1
aaa
◆file2
bbb
2.featureAブランチにコミットを追加して、下記のようなファイル状態にする(最終)
◆file1
aaa
AAA
あああ
◆file2
bbb
BBB
びーびーびー
featureAブランチのコミット履歴
$ git log
commit 2b8d2984ba754b780f469ab32755df9bffd27c02 (HEAD -> fearureA)
Author: tatsuya1995
Date: Sat Jul 30 18:08:29 2022 +0900
file2にBBBとびーびーびー追加
commit 0b253dd91db81953cf8d52eda0aa8f87442a51ec
Author: tatsuya1995
Date: Sat Jul 30 18:06:53 2022 +0900
file1にAAAとあああ追加
commit 8eba7ea1f224dff44551cd85b478198b246437e2
Author: tatsuya1995
Date: Sat Jul 30 18:03:26 2022 +0900
file1とfile2作成
※featureBブランチは初期状態のcommit 8eba7ea1f224dff44551cd85b478198b246437e2
から派生したままにしているため、file2の中身は変更なしのまま。
3. cherry-pick実行
cherry-pickを行ない、featureBブランチにcommit 2b8d2984ba754b780f469ab32755df9bffd27c02
のfile2に対する変更だけを取り込む。
$ git cherry-pick 2b8d2984ba754b780f469ab32755df9bffd27c02
[featureB ade1b86] file2にBBBとびーびーびー追加
Date: Sat Jul 30 18:08:29 2022 +0900
1 file changed, 3 insertions(+), 1 deletion(-)
◆featureBブランチのログ
$ git log
commit ade1b86f9258b8da8b80dc9cce86bc9627f87b8a (HEAD -> featureB)
Author: tatsuya1995
Date: Sat Jul 30 18:08:29 2022 +0900
file2にBBBとびーびーびー追加
commit 8eba7ea1f224dff44551cd85b478198b246437e2
Author: tatsuya1995 [tatsuyawada1995@gmail.com](mailto:tatsuyawada1995@gmail.com)
Date: Sat Jul 30 18:03:26 2022 +0900
file1とfile2作成
featureBの中身
◆file1
aaa
◆file2
bbb
BBB
びーびーびー
file2に対する変更したコミットのみ取り込まれた!
流れとしては下記のようになる。
git cherry-pick nオプション
ちなみにgit cherry-pick [コミットID]
ではコミットもセットで行われるので、変更を取り込むだけにしたいときはnオプションをつければよい。
$ git cherry-pick -n 0b253dd91db81953cf8d52eda0aa8f87442a51ec
$ git status
On branch featureB
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file1
git addされた状態で取り込まれる。