Gitを使っていると、次のような場面に出会うことはありませんか?
- 別ブランチの特定のコミットだけを取り込みたい
- ブランチ全体をマージするのは影響が大きすぎる
そんなときに便利なのがgit cherry-pickコマンドです。
この記事では、git cherry-pickとは何か、どんな場面で使うのか、基本的な使い方、コンフリクトが発生した場合の対応方法を図を用いてわかりやすく解説します。
git cherry-pickとは?
git cherry-pickは、指定したコミットだけを現在のブランチに取り込むためのコマンドです。
通常のgit mergeは「ブランチ全体の変更」をまとめて取り込みますが、git cherry-pickはコミット単位で選んで取り込めるのが大きな特徴です。
ブランチ間で特定のコミットをマージしたいが、全部はマージしたくない場合git cherry-pickが役に立ちます。例えば、特定のバグ修正や特定の機能のみを取り込みたいときにgit cherry-pickを使います。
cherry-pickは英語の慣用句で、「良いところだけを選んで取り出す」「つまみ食いする」といった意味があります。Gitのgit cherry-pickという名前も、この意味から来ています。
git cherry-pickの使い方

例えば上図のような場面で「ブランチa」に「ブランチb」の「コミットB」のみを取り込みたいとします。この時、
git checkout a
git merge bとしてしまうと、「ブランチb」の「全てのコミット(B・C・Dのコミット)」を取り込むことになります。しかし、以下のようにgit cherry-pickを使えば、「ブランチb」の「特定のコミット(Bのコミット)」を「ブランチa」に取り込むことができます。
git checkout a
# Bのコミットのみを取り込む場合
git cherry-pick <BのコミットID>git cherry-pickを実行すると、指定したコミットの変更内容だけが現在のブランチに新しいコミットとして追加されます。元のコミットIDと同じコミットIDにはなりませんので注意してください(同一の変更内容が複数のブランチに異なるコミットIDで存在することになります)。今回の場合だと、「コミットB」と「コミットB'」は同じコミットIDになりません。
また、複数のコミットIDを並べて指定することも可能です。
git checkout a
# BのコミットとCのコミットを取り込む場合
git cherry-pick <BのコミットID> <CのコミットID>連続したコミットを範囲指定することもできます。
git checkout a
# BのコミットからDのコミットを取り込む場合
git cherry-pick <BのコミットID>^..<DのコミットID>この指定は、
<BのコミットID>^:Bのひとつ前のコミット<DのコミットID>:Dまで
という意味になり、BからDまでのすべてのコミット(B・C・D)が順番に取り込まれます。
git cherry-pickでコンフリクトが発生した場合
git cherry-pickの実行中にコンフリクトが発生した場合は、競合している箇所を手動で修正する必要があります。
まず、コンフリクトしているファイルを開き、競合部分を確認して内容を修正します。修正が完了したら、修正したファイルをステージングします。
git add .その後、cherry-pickを続行します。
git cherry-pick --continue補足
コンフリクトを解決せず、cherry-pick自体を中断したい場合は、次のコマンドを実行します。このコマンドを実行すると、cherry-pick開始前の状態に戻ります。
git cherry-pick --abort本記事のまとめ
この記事ではgit cherry-pickコマンドについて説明しました。
git cherry-pickは、ブランチ全体をマージせずに「必要なコミットだけ」を安全に取り込める便利なコマンドです。影響範囲を最小限に抑えたい場面や、ピンポイントで修正を反映したいときに特に役立ちます。git mergeとの違いを意識しながら、状況に応じて使い分けていきましょう。
お読みいただきありがとうございました。