「git cherry-pick 複数」で検索した方向けに、複数コミットをまとめて取り込む方法を整理します。個別指定・範囲指定・コンフリクト対応まで、実務で使えるコマンドを確認しましょう。
複数コミットをcherry-pickする代表的なコマンド
複数コミットをcherry-pickする主な方法は3つあります。
# 個別に複数コミットを指定する
git cherry-pick commitA commitB commitC
# 連続した範囲を指定する(commitAを含む)
git cherry-pick commitA^..commitB
# 連続した範囲を指定する(commitAを含まない)
git cherry-pick commitA..commitB
それぞれの違いと使い方を以下で詳しく説明します。
複数コミットを個別に指定する方法
バラバラのコミットをまとめて取り込む場合は、コミットハッシュをスペース区切りで並べます。
git cherry-pick commitA commitB commitC
指定したコミットは、左から右の順番(commitA → commitB → commitC)に適用されます。コミットハッシュは git log --oneline で確認できます。
git log --oneline
# 例:
# abc1234 機能Cを追加
# def5678 機能Bを追加
# ghi9012 機能Aを追加
# ...
連続したコミット範囲を指定する方法
連続したコミットをまとめて取り込む場合は、範囲指定を使います。
A^..B:開始コミットを含む範囲指定
git cherry-pick commitA^..commitB
A^..B は「commitAの1つ前のコミットから commitB まで」を意味します。結果として、commitA自身も含まれます。
A..B:開始コミットを含まない範囲指定
git cherry-pick commitA..commitB
A..B は「commitAより後から commitB まで」を意味します。つまり、commitA自身は含まれません。
A^..B と A..B の違いのまとめ
| 構文 | commitAを含むか | commitBを含むか |
|---|---|---|
A^..B |
含む | 含む |
A..B |
含まない | 含む |
よくある失敗として、「commitAを含めたいのに A..B と書いてしまう」ケースがあります。commitAを含む場合は必ず A^..B を使いましょう。
範囲内のコミットを事前確認する
実際にcherry-pickする前に、どのコミットが含まれるか確認しておくと安全です。
# A..B の範囲に含まれるコミットを一覧表示
git log --oneline commitA..commitB
cherry-pickされる順序
複数のコミットをcherry-pickした場合、指定した順番(古い順)で1つずつ適用されます。
- 個別指定の場合:左に書いた順(commitA → commitB → commitC)
- 範囲指定の場合:古いコミットから新しいコミットへ順に適用
コミットの順序を誤ると、後のコミットが依存する変更が存在しない状態になり、コンフリクトや予期しない動作の原因になります。
コンフリクトが発生した場合の対応
cherry-pick中にコンフリクトが発生することがあります。対応手順は以下のとおりです。
1. コンフリクトの状態を確認する
git status
コンフリクトしているファイルが both modified などの状態で表示されます。
2. コンフリクトを解消する
該当ファイルを開いてコンフリクトマーカー(<<<<<<<、=======、>>>>>>>)を確認し、正しい内容に修正します。
3. 解消したファイルをステージする
git add <解消したファイル>
4. cherry-pickを続行する
git cherry-pick --continue
複数コミットをcherry-pickしている場合は、残りのコミットについて同じ手順を繰り返します。
cherry-pickを中止する方法
コンフリクトが複雑で解消が難しい場合や、やり直したい場合は --abort で中止できます。
git cherry-pick --abort
このコマンドを実行すると、cherry-pick前の状態に戻ります。
コミットせずに変更だけ取り込む方法(-n オプション)
cherry-pickした変更をすぐにコミットせず、ステージした状態で止めたい場合は -n(--no-commit)オプションを使います。
git cherry-pick -n commitA commitB
複数コミットの変更をまとめて1つのコミットとして整理したい場合や、内容を確認してから手動でコミットしたい場合に便利です。
マージ・rebaseとの違い
| コマンド | 特徴 | 向いているケース |
|---|---|---|
cherry-pick |
特定コミットだけを選んで適用 | 一部の修正だけを別ブランチに取り込みたい |
merge |
ブランチ全体の変更を統合 | ブランチの全変更をまとめて取り込みたい |
rebase |
コミット履歴を付け替える | 履歴を一直線に整理したい |
cherry-pickは「必要な変更だけを選ぶ」操作のため、ブランチ全体を統合するmergeやrebaseとは用途が異なります。
cherry-pick後にmergeすると履歴が複雑になる場合の注意点
cherry-pickで取り込んだコミットを後でmergeすると、同じ変更が2回現れる形になり、履歴が複雑になります。また、コンフリクトが発生しやすくなります。
cherry-pickは「一時的な取り込み」として使い、最終的にはブランチをmergeする場合は重複適用に注意してください。
よくある失敗例
開始コミットが範囲に含まれない
A..B を使ったとき、commitAが含まれないことを見落とすケースです。commitAを含めたい場合は A^..B を使ってください。
コミットの順序を誤る
個別指定で新しいコミットを先に書いてしまうと、依存関係の問題でコンフリクトや不整合が起きます。古いコミットから順に書くのが基本です。
途中でコンフリクトして状態が分からなくなる
コンフリクト中の状態では git status で現在の状況を確認できます。続行するなら --continue、やり直すなら --abort を使います。
git status # 現在の状態を確認
git cherry-pick --continue # 解消後に続行
git cherry-pick --abort # やり直す場合
同じ変更を二重に取り込む
cherry-pickしたコミットを後でmergeすると、同じ変更が2回適用されてしまう場合があります。どのコミットを取り込んだか記録しておき、merge時に注意してください。
よくある疑問
複数コミットを一括でcherry-pickするにはどうするか
コミットハッシュをスペース区切りで並べるか、範囲指定を使います。
git cherry-pick commitA commitB commitC
# または
git cherry-pick commitA^..commitC
連続したコミットをまとめて指定するにはどうするか
commitA^..commitB の形式で範囲指定します。git log --oneline commitA..commitB で対象コミットを事前確認しておくと安心です。
範囲指定で最初のコミットを含めるにはどうするか
A^..B の形式を使います。A..B だと最初のコミット(A)が含まれないため注意してください。
コンフリクトしたらどうするか
ファイルを修正 → git add → git cherry-pick --continue の手順で対応します。解消できない場合は git cherry-pick --abort でキャンセルできます。
cherry-pickを取り消すにはどうするか
cherry-pick中であれば git cherry-pick --abort、完了後であれば git revert でコミットを元に戻します。
関連記事
- git cherry-pick – 特定のコミットを別のブランチに適用するコマンド
- git rebase – コミット履歴を付け替えるコマンド
- git revert – コミットを取り消す新しいコミットを作成するコマンド
まとめ
git cherry-pick で複数コミットを取り込む場合は、以下のポイントを押さえてください。
- 個別指定:
git cherry-pick commitA commitB commitC - 範囲指定(Aを含む):
git cherry-pick A^..B - 範囲指定(Aを含まない):
git cherry-pick A..B - コンフリクト時:
git status→ 修正 →git add→git cherry-pick --continue - 中止:
git cherry-pick --abort - コミットせず適用:
git cherry-pick -n
cherry-pickは特定の変更だけを別ブランチへ選んで取り込む強力な機能です。範囲指定や順序を正しく理解し、コンフリクト対応も含めて適切に使いましょう。

コメント