症状
別ブランチの複数コミットを現在のブランチに取り込みたい
結論:まずこれを確認
git log --oneline <ブランチ名>で取り込みたいコミットのハッシュを特定する- 範囲指定なら
git cherry-pick <開始>^..<終了>を使う - 個別指定なら
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 で中止する。
関連するトラブル
準備中
解決しない場合
- Git公式ドキュメント - git-cherry-pick
- 確認すべきログ:
git reflog(操作履歴の確認) - 次に調べるキーワード: 「git rebase」「git cherry-pick conflict」「git cherry-pick range」