🍒

Gitのcherry-pickを使いこなす:特定のコミットだけを別ブランチに適用する方法

2025/02/25に公開

git cherry-pickは、特定のコミットを別のブランチに適用したい場合に便利なコマンドです。全ての変更をマージする必要がない場合、または特定の修正だけを取り込みたい場合に使用します。

例えば、「バグ修正だけを本番ブランチに適用したい」といった場面で活躍します。

🛠️ git cherry-pickの基本の書き方

git cherry-pick <コミットハッシュ>
  • <コミットハッシュ> は適用したいコミットのIDです。

複数のコミットを同時に適用する場合:

git cherry-pick <コミットハッシュ1> <コミットハッシュ2> ...

または、連続したコミットを範囲指定する場合:

git cherry-pick <開始コミットハッシュ>^..<終了コミットハッシュ>

developブランチからの修正する時

ブランチ構成

以下のようなブランチで作業をしているとします。

a --- b --- c --- d   (develop)
       \
        e --- f --- g --- h  (fix)
  • developブランチ:メインの開発ブランチ。
  • fixブランチ:バグ修正用のブランチ。
  • e, f, g, h:バグ修正に関するコミット。

やりたい事

fixブランチの**gコミット**だけをdevelopブランチに適用したいとします。


具体的な手順

  1. developブランチに移動

    git checkout develop
    
  2. 適用したいコミットの確認

    git log --oneline --graph --all
    

    出力例:

    h890123 (fix) 修正4
    g789012 修正3 ← これをcherry-pickしたい
    f456789 修正2
    e123456 修正1
    d987654 開発機能4
    c654321 開発機能3
    b321098 開発機能2
    a123987 初回コミット
    
  3. cherry-pickを実行

    git cherry-pick g789012
    

⚠️ マージコンフリクト(競合)の発生する場合

先ほどの例でgコミットが**efコミットに依存していると、直接適用できずコンフリクト**が発生します。

エラーメッセージの例

error: could not apply g789012... 修正3
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git cherry-pick --continue'

🛠️ コンフリクトの解決手順

  1. 競合状態を確認

    git status
    

    出力例:

    On branch develop
    You are currently cherry-picking commit g789012.
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
    
    both modified:   src/app.js
    
  2. 競合箇所を修正

    ファイル内の競合部分は以下のように表示されます:

    <<<<<<< HEAD
    開発ブランチの変更
    =======
    gコミットの変更内容
    >>>>>>> g789012
    

    → 手動で競合部分を修正し、不要なマーカーを削除します。

  3. 修正したファイルをステージング

    git add src/app.ts
    
  4. cherry-pickの続行

    git cherry-pick --continue
    
  5. もし中断したい場合

    git cherry-pick --abort
    

🧠 競合を回避するためのポイント

  • 依存関係を確認する:
    gコミットがefの変更に依存している場合、その前のコミットも取り込む必要があるか検討します。

  • 複数コミットをまとめてcherry-pick:
    e, f, gの変更が密接に関連している場合、一連のコミットをまとめて適用する方が安全です。

    git cherry-pick e123456^..g789012
    

🤔 git cherry-pickを利用ケースと注意点

利用ケース

  • ブランチ元を変えたい時(rebaseの方が良いとは思います)
  • 緊急のバグ修正を本番環境に反映したいとき。
  • 特定の機能や修正だけを別ブランチに取り込みたい場合。

⚠️ 注意点

  • コミット履歴が複雑化することがある → 履歴をきれいに保ちたい場合は慎重に。
  • マージコミットはそのままcherry-pickできない → 必要なら-mオプションを使う。
  • 依存関係を確認する:
    cherry-pickするコミットが前のコミットに依存している場合は、競合が発生しやすくなります。

git cherry-pickは、特定のコミットだけを別ブランチに適用したい場合に便利です。しかし、依存関係のあるコミットを選ぶと競合が発生しやすいびで注意は必要です。コミットの関係性を把握した上で慎重に作業しましょう。

株式会社find | 落とし物クラウド

Discussion