git cherry-pickで複数コミットを取り込む方法|範囲指定・コンフリクト対応も解説

コマンドリファレンス

「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 addgit cherry-pick --continue の手順で対応します。解消できない場合は git cherry-pick --abort でキャンセルできます。

cherry-pickを取り消すにはどうするか

cherry-pick中であれば git cherry-pick --abort、完了後であれば 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 addgit cherry-pick --continue
  • 中止:git cherry-pick --abort
  • コミットせず適用:git cherry-pick -n

cherry-pickは特定の変更だけを別ブランチへ選んで取り込む強力な機能です。範囲指定や順序を正しく理解し、コンフリクト対応も含めて適切に使いましょう。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント