カテゴリー
Linux

【Git】cherry pick を理解する。そして各コミットを別々のブランチに振り分ける実践例

やりたいこと

  • ブランチ A のいくつかのコミットを、ブランチ B、ブランチ C に分けたい。
  • 具体的に言うと、ブランチ A に含まれるコミット A1 をブランチ B に、ブランチ A に含まれるコミット A2 をブランチ C に分けたい。
  • 誤解語弊を恐れず直感的にに言えば、マージの逆の操作をしたい。

cherry pick コマンドと使い方まとめ

# commit1、commit2、commit3 があるとする。
# commit3 を適用したい (commit2 から commit3 の変更を取り込みたい)
git cherry-pick commit3

# 次に紹介する使い方をよりよく理解するために。
# git cherry-pick commit3 は始点と終点のうち、始点を省略した形となる。
# commit3 の適用は、次のコマンドでも全く同じ結果となる。
git cherry-pick commit2..commit3

# コミット範囲を複数して cherry pick する時
# git cherry-pick <古いコミット>..<新しいコミット>
# commit2 および commit3 を適用したい。
# (commit1 から commit2 および commit2 から commit3 の変更を取り込みたい)
git cherry-pick commit1..commit3

具体的に、実践

$ # やりたいこと
$ # import-another ブランチに e34b043 コミットを適用したい
$ # testing ブランチに f72bf5b と 0e27219 コミットを適用したい
$
$ # 作業前の状態を確認
$ git log --all --decorate --graph --online
* 0e27219 (origin/feature11) デフォルト表示を変更
* f72bf5b test 画面の追加
* e34b043 インポート機能追加 問い合わせのため未完成
* 38fe6f1 (HEAD -> master, import-another, testing) feature10 リリース
... 略 ...
$ # これより、作業開始!
$
$
$
$ # import-another ブランチに e34b043 コミットを適用したい
$ # 適用したいブランチ import-another にチェックアウト
$ git checkout import-another
Switched to branch 'import-another'
$ # cherry pick で 38fe6f1 から e34b043 の差分を適用
$ git cherry-pick e34b043
[import-another 806b3c9] インポート機能追加 問い合わせのため未完成
Author user1 <user1@example.com>
Date: Wed Dec 7 19:39:00 2016 +0900
7 files changed, 1477 insertions(+)
create mode 100644 application/controllers/imp.php
... 略 ...
$ # 適用を確認し、OK!
$ git log --all --decorate --graph --online
* 806b3c9 (HEAD -> import-another) インポート機能追加 問い合わせのため未完成
| * 0e27219 (origin/feature11) デフォルト表示を変更
| * f72bf5b test 画面の追加
| * e34b043 インポート機能追加 問い合わせのため未完成
|/
* 38fe6f1 (master, testing) feature10 リリース
... 略 ...
$
$
$
$ # testing ブランチに f72bf5b と 0e27219 コミットを適用したい
$ # 適用したいブランチ testing にチェックアウト
$ git checkout testing
Switched to 'testing'
$ # cherry pick で e34b043 から f72bf5b および f72bf5b から 0e27219 の差分を適用
$ # git cherry-pick <古いコミット>..<新しいコミット> を使用するが、
$ # 次は誤り: git cherry-pick f72bf5b..0e27219
$ # 次が正しい: git cherry-pick e34b043..0e27219
$ git cherry-pick e34b043..0e27219
[testing dacd843] test 画面の追加
Author user1 <user1@example.com>
Date: Wed Dec 7 20:39:00 2016 +0900
11 files changed, 75 insertions(+), 5 deletions(-)
[testing 545fda4] デフォルト表示を変更
Author user1 <user1@example.com>
Date: Wed Dec 8 18:39:00 2016 +0900
5 files changed, 14 insertions(+), 14 deletions(-)
$ # 適用を確認し、OK!
$ git log --all --decorate --graph --online
* 545fda4 (HEAD -> testing) デフォルト表示を変更
* dacd843 test 画面の追加
| * 806b3c9 (import-another) インポート機能追加 問い合わせのため未完成
|/
| * 0e27219 (origin/feature11) デフォルト表示を変更
| * f72bf5b test 画面の追加
| * e34b043 インポート機能追加 問い合わせのため未完成
|/
* 38fe6f1 (master, testing) feature10 リリース
... 略 ...

おわりに

次のページが参考になりました。ありがとう存じます!

以上です。

「【Git】cherry pick を理解する。そして各コミットを別々のブランチに振り分ける実践例」への2件の返信

”cherry pick コマンドと使い方まとめ” において、2つ目と3つ目のgitコマンド内容が同じですが、コメントで実施される内容が異なっています。3つ目が誤っているように思えます。

コメントありがとう存じます!

ご指摘のとおりです。次のように訂正いたしました。

git cherry-pick commit2..commit3

git cherry-pick commit1..commit3

この度はどうもありがとうございました。感謝いたします。

コメントを残す