「あのコミットだけ欲しい!」を叶える git cherry-pick 活用術
はじめに
Git を使っていると、「あっちのブランチで作った、あのコミットだけを、今のブランチに持ってきたい!」という場面に出くわすことがあります。
-
mergeやrebaseだと、ブランチ全体の変更を取り込んでしまう... - 修正内容を手動でコピペするのは面倒だし、ミスが起きやすい...
そんな悩みを解決してくれるのが git cherry-pick(チェリーピック)コマンドです。
この記事では、git cherry-pick がどのような場面で役立つのか(活用事例)から、便利な使い方(テクニック集)、そしてコンフリクトの対処法までを分かりやすく解説します。
git cherry-pick とは?
git cherry-pick は、一言でいうと**「他のブランチにある特定のコミットだけを、現在のブランチにコピーして持ってくる」**コマンドです。
その名の通り、たくさんのコミットの中から美味しいコミット(チェリー 🍒)だけを「つまみ食い(pick)」するイメージです。
🍒 cherry-pick はいつ使う?(実践・活用事例)
cherry-pick が輝く具体的なシチュエーションを見ていきましょう。
事例1:緊急のバグ修正(ホットフィックス)
状況:
develop ブランチで新機能(A, B)を開発中に、重大なバグ(C)を発見し、修正コミット(commit C)を作成しました。
しかし、このバグは本番環境(main ブランチ)にも影響があることが判明。新機能(A, B)はまだ未完成ですが、バグ修正(commit C)だけは今すぐ main に適用してリリースしたい!
解決:
main ブランチにチェックアウトし、commit C だけを cherry-pick します。
# 1. 本番ブランチに移動
git checkout main
# 2. developブランチの「commit C」のハッシュを指定して適用
git cherry-pick <commit C のハッシュ>
# 3. mainブランチをプッシュして緊急リリース
git push origin main
事例2:ブランチを間違えたコミットの救出
状況:
feature-A ブランチで作業するつもりが、うっかり feature-B ブランチにコミット(commit Y)してしまいました。feature-B には不要で、feature-A にのみ必要なコミットです。
解決:
feature-A ブランチに移動し、commit Y を cherry-pick します。
# 1. 本来コミットすべきだったブランチに移動
git checkout feature-A
# 2. 間違えてコミットした「commit Y」のハッシュを指定
git cherry-pick <commit Y のハッシュ>
(その後、feature-B ブランチは git reset や git rebase -i などで不要な commit Y を削除・整理します)
事例3:必要な機能の先行取り込み
状況:
自分が frontend ブランチを開発中。同僚が backend ブランチで API を開発しており、その中で「API のモック定義」のコミット(commit M)が完了しました。
API 全体はまだ未完成ですが、そのモック定義だけ先に frontend ブランチに取り込んで、UI の開発を進めたいです。
解決:
frontend ブランチで commit M を cherry-pick します。
git checkout frontend
git cherry-pick <commit M のハッシュ>
事例4:mock ブランチからの「使える画面改修」の取り込み
状況:
フロントエンド開発で、feature/my-task(本開発ブランチ)とは別に、feature/mock-ui というブランチ(モックデータを使って先行的にUIを試作・改修するブランチ)があるとします。
feature/mock-ui ブランチでは、デザイナー確認用に「ヘッダーの新UI改修」(commit H)と「新機能一覧ページの暫定レイアウト」(commit L)がコミットされました。
あなたは今 feature/my-task で作業中ですが、「新機能一覧ページ」は今回のタスクと無関係(またはモック依存が強すぎて使えない)なものの、「ヘッダーの新UI改修」だけは先に自分のブランチに適用したいと考えました。
解決:
自分の作業ブランチ(feature/my-task)で、feature/mock-ui ブランチにある「ヘッダーの新UI改修」コミット(commit H)だけを cherry-pick します。
# 1. 自分の作業ブランチにいることを確認
git checkout feature/my-task
# 2. mock-uiブランチの「ヘッダーの新UI改修」コミットハッシュを指定
git cherry-pick <commit H のハッシュ>
メリット:
feature/mock-ui ブランチ全体をマージすると、まだ不要な(あるいはモック依存の強い)「新機能一覧ページの暫定レイアウト」まで取り込んでしまいます。cherry-pick を使うことで、今すぐ使える「画面改修」コミットだけをピンポイントで選んで取り込み、開発を効率化できます。
🛠️ 基本的な使い方
最もシンプルな使い方は、コミットハッシュを指定するだけです。
# 1. コミットを取り込みたいブランチに移動
git checkout main
# 2. 対象のコミットハッシュを指定して実行
# (コミットハッシュは git log などで調べます)
git cherry-pick <取り込みたいコミットのハッシュ>
例: git cherry-pick a1b2c3d4
🚀 もっと便利に! cherry-pick テクニック集
ここからは、cherry-pick をさらに便利に使いこなすためのオプションやテクニックを紹介します。
テクニック1:複数のコミットを一度に指定する
A. 飛び飛びのコミットを取り込む
複数のコミットハッシュをスペースで区切って指定します。
# ハッシュA と ハッシュC を取り込む (Bは飛ばす)
git cherry-pick <ハッシュA> <ハッシュC>
B. 連続したコミットを範囲で取り込む
..(ドット2つ)を使って範囲指定ができます。
# B, C, D を取り込む (Aは含まない)
git cherry-pick <ハッシュA>..<ハッシュD>
⚠️
..の注意点
A..Bは「A を含まず、B まで」という意味です(Aの 次 からBまで)。
もしAも含めたい場合は、^を使います。# A, B, C, D を取り込む (Aも含む場合) # Aの1個前(^で示す)からDまで、という意味 git cherry-pick <ハッシュA>^..<ハッシュD>
テクニック2:コミットせず、変更だけ適用する (-n / --no-commit)
cherry-pick は通常、実行すると自動でコミットが作成されます。
-n オプションを付けると、コミットはせず、変更内容を作業ディレクトリとステージングエリアに適用するだけになります。
活用例:
複数のコミット(1, 2)を cherry-pick し、それらをまとめて1つのコミットとして適用したい時に便利です。
git cherry-pick -n <ハッシュ1>
git cherry-pick -n <ハッシュ2>
# この時点で変更がステージングされているので、まとめてコミット
git commit -m "ハッシュ1と2の変更を統合して適用"
テクニック3:コミットメッセージを編集する (-e / --edit)
cherry-pick を実行する際、コミットメッセージの編集画面(Vimなど)を開かせることができます。
適用先のブランチの文脈に合わせて、「なぜこのコミットを cherry-pick したのか」などの情報を追記したい場合に便利です。
git cherry-pick -e <ハッシュ>
テクニック4:元のコミット情報を記録する (-x)
これはチーム開発で非常に推奨されるオプションです。
-x オプションを付けると、cherry-pick で作成されたコミットのメッセージ末尾に、自動で以下の一文が追加されます。
(cherry picked from commit <元のコミットハッシュ>)
メリット:
後から git log で履歴を見たときに、「ああ、このコミットはあのブランチから cherry-pick されてきたんだな」と追跡(トレーサビリティ)が非常に容易になります。
# 元のコミット情報を自動で記録する(推奨!)
git cherry-pick -x <ハッシュ>
😱 コンフリクト発生! 冷静な対処法
cherry-pick も merge と同様に、適用しようとした変更が現在のブランチの変更と競合(コンフリクト)することがあります。
焦らず、以下の手順で対処しましょう。
-
コンフリクト発生
git cherry-pickを実行すると、コンフリクトが起きた旨のメッセージが表示され、処理が停止します。 -
ファイルを修正
VS Code などのエディタでコンフリクトマーカー (<<<<<,=====,>>>>>) が入ったファイルを開き、手動で正しい内容に修正します。 -
修正をステージング
ファイルを修正したら、git addします。git add <修正したファイル名> -
cherry-pickを続行
ステージングが完了したら、以下のコマンドでcherry-pickを続行します。これでgit cherry-pick --continuecherry-pickが完了(または次のコミットの適用)に進みます。
💡 覚えておくと安心なコマンド
コンフリクトでパニックになった時に備えて、以下のコマンドも覚えておきましょう。
-
git cherry-pick --abort
「もう無理! やり直したい!」という時に使います。
コンフリクト解消をあきらめ、cherry-pickを実行する前の状態に完全に元に戻します。 -
git cherry-pick --skip
(複数のコミットをcherry-pickしている場合)
コンフリクトした現在のコミットの適用はあきらめてスキップし、次のコミットの適用に進みます。
⚠️ cherry-pick を使う際の注意点
cherry-pick は強力ですが、銀の弾丸ではありません。使用には注意が必要です。
1. コミットハッシュは新しくなる
cherry-pick は「コピー」です。元のコミットと内容は同じでも、コミットハッシュは新しく発行されます。Git の履歴上は、2つの異なるコミットとして(内容は似ていますが)存在することになります。
2. 多用は禁物(履歴の汚染)
cherry-pick を多用すると、同じ変更内容を持つコミットが複数のブランチに散らばることになり、Git の履歴が非常に複雑で追いづらくなります。
基本的なブランチ運用は merge や rebase を使うべきです。cherry-pick は、あくまで「ピンポイントで、どうしても今これだけが必要」という時の緊急措置や例外対応として使うのが望ましいです。
3. コミットの依存関係に注意
取り込みたいコミット(commit B)が、その前のコミット(commit A)の変更内容に依存している(A がないと B が動かない)場合があります。
この状況で commit B だけを cherry-pick すると、コードが動かなくなったり、大量のコンフリクトが発生したりする原因になります。
おわりに
git cherry-pick は、特定のコミットだけをピンポイントで適用したい場合に非常に強力なコマンドです。
- 緊急のバグ修正
- ブランチを間違えた時のリカバリ
- 必要なモックや機能の先行取り込み
などで真価を発揮します。
便利なオプション(特に -x や -n)やコンフリクト対処法(--continue, --abort)を覚えて、安全に使いこなし、開発効率をアップさせましょう!
Discussion