症状

別ブランチの複数コミットを現在のブランチに取り込みたい

結論:まずこれを確認

  1. git log --oneline <ブランチ名> で取り込みたいコミットのハッシュを特定する
  2. 範囲指定なら git cherry-pick <開始>^..<終了> を使う
  3. 個別指定なら git cherry-pick <hash1> <hash2> <hash3> を使う

操作フロー

    flowchart TD
    A[複数コミットを取り込みたい] --> B{コミットは連続している?}
    B -->|Yes| C[範囲指定で cherry-pick]
    B -->|No| D[個別にハッシュを指定]
    C --> E[git cherry-pick 開始^..終了]
    D --> F[git cherry-pick hash1 hash2 hash3]
    E --> G{コンフリクト発生?}
    F --> G
    G -->|Yes| H[コンフリクト解消]
    G -->|No| I[完了]
    H --> J[git add → git cherry-pick --continue]
    J --> G
  

よくある原因

cherry-pick がうまくいかない・迷う原因として以下がある。

  • ハッシュの指定順序を間違えている — 古い方を先に指定する必要がある
  • 範囲指定で開始コミットが含まれない^ を付け忘れると開始コミット自体は含まれない
  • 取り込み先ブランチを間違えている — checkout せずに実行してしまう
  • コンフリクトで中断したまま放置 — cherry-pick の途中状態が残る
  • マージコミットを指定している — 通常の cherry-pick ではマージコミットは取り込めない
  • コミットが既に取り込み済み — 同じ変更を再度取り込もうとしている

操作手順

ステップ1: 現在の状態を確認する

    git status
git branch
  

🔍 チェックポイント: 作業中の変更がないこと、正しいブランチにいることを確認

ステップ2: 取り込みたいコミットを特定する

    # 対象ブランチのコミット履歴を確認
git log --oneline feature-branch

# 出力例
# a1b2c3d 3番目のコミット(新しい)
# e4f5g6h 2番目のコミット
# i7j8k9l 1番目のコミット(古い)
  

🔍 チェックポイント: 取り込みたいコミットのハッシュをメモする

ステップ3: 取り込み先ブランチに移動する

    git checkout main
  

🔍 チェックポイント: git branch* main のようにアスタリスクが付いていることを確認

ステップ4-A: 連続した複数コミットを取り込む(範囲指定)

    # i7j8k9l から a1b2c3d までの3つを取り込む
git cherry-pick i7j8k9l^..a1b2c3d
  

重要: ^ を付けないと開始コミット(i7j8k9l)自体は含まれない

🔍 チェックポイント: git log --oneline -5 で取り込まれたか確認

ステップ4-B: 個別のコミットを取り込む(複数指定)

    # 古い順に指定する
git cherry-pick i7j8k9l e4f5g6h a1b2c3d
  

🔍 チェックポイント: 古い方から順に指定すること

ステップ5: コンフリクトが発生した場合

    # コンフリクトしたファイルを確認
git status

# ファイルを編集してコンフリクトを解消

# 解消後、ステージングに追加
git add <コンフリクトしたファイル>

# cherry-pick を続行
git cherry-pick --continue
  

🔍 チェックポイント: git status で「Unmerged paths」がなくなっていること

ステップ6: 結果を確認する

    git log --oneline -10
  

🔍 チェックポイント: 取り込んだコミットが履歴に表示されていること

NG行動

  • git cherry-pick --abort を安易に実行する — コンフリクト解消中の作業がすべて失われる
  • ハッシュを新しい順に指定する — 依存関係が壊れてコンフリクトが増える可能性がある
  • マージコミットをそのまま cherry-pick する-m オプションなしでは失敗する
  • 作業中の変更がある状態で実行する — 変更が混在して混乱する
  • 取り込み先ブランチを確認せずに実行する — 意図しないブランチに取り込んでしまう

よくある質問(FAQ)

Q1: cherry-pick を途中でやめたい場合は?

A: git cherry-pick --abort を実行する。ただし、途中まで解消したコンフリクトの作業は失われる。

Q2: マージコミットを cherry-pick するには?

A: git cherry-pick -m 1 <hash> のように -m オプションで親番号を指定する。通常は 1 を指定する(メインラインの親)。

Q3: 同じコミットを再度 cherry-pick したらどうなる?

A: 同じ変更内容なら「空のコミット」として扱われるか、コンフリクトが発生する。--skip で飛ばすか、--abort で中止する。

関連するトラブル

準備中

解決しない場合