git cherry-pickでお困りですか?「特定のコミットだけを別ブランチに適用したい」「マージしたくないけど一部の変更は欲しい」「リリースブランチにバグ修正だけ適用したい」といった悩みを抱えるエンジニアは多いものです。
実は、git cherry-pickは選択的なコミット適用で柔軟な開発フローを実現するができる強力なコマンドです。この記事では、実務で本当に使えるgit cherry-pickの活用法を、豊富な実例とともに徹底解説します。
最後まで読むことで、git cherry-pickをマスターし、緊急パッチ対応時間を80%短縮を実現できるようになります。
🎯 この記事で学べること
- git cherry-pickの基本的な使い方と動作原理
- 実務で使える実践的なオプションとテクニック
- コンフリクト発生時の解決方法とトラブルシューティング
- チーム開発で役立つベストプラクティス
- 複数コミットの効率的な適用方法
📋 前提知識
- Gitの基本概念(リポジトリ、コミット、ブランチ)の理解
- コマンドラインの基本操作
- git log、git status等の基本コマンドの使用経験
読了時間: 約15分
難易度: (中級)
🚀 git cherry-pickとは?基本概念の理解
概要と役割
git cherry-pickは、指定したコミットを現在のブランチに適用するコマンドです。他のブランチから特定の変更だけを取り込みたい場合に使用し、merge や rebase とは異なり、選択したコミットのみを対象とします。
開発現場でよくあるのが、機能ブランチで修正したバグをリリースブランチにも適用したいケース、または実験ブランチの一部の変更だけを本流に取り込みたいケースです。cherry-pickを使えば、不要な変更を含めることなく、必要な修正のみを正確に適用できます。
動作原理の図解
他のコマンドとの関係
関連コマンド | 役割 | 使い分け |
---|---|---|
git merge | ブランチ全体をマージ | ブランチの全変更を統合したい時 |
git rebase | コミット履歴を再配置 | 履歴を整理しつつ統合したい時 |
git apply | パッチを適用 | ファイルの差分を適用したい時 |
📝 基本的な使い方
コマンドの基本構文
git cherry-pick [オプション] <コミット>...
最もシンプルな使用例
# 基本形
git cherry-pick abc1234
# 実行例
$ git cherry-pick abc1234
[main 5ef6789] Fix critical bug in user authentication
Date: Tue Jan 15 14:30:22 2025 +0900
1 file changed, 3 insertions(+), 1 deletion(-)
解説:
abc1234
は適用したいコミットのハッシュ値- cherry-pickは新しいコミットを作成します(元のコミットとは異なるハッシュになる)
- コミットメッセージは元のコミットから自動的にコピーされます
よく使うオプション一覧
オプション | 説明 | 使用例 |
---|---|---|
-n, --no-commit | コミットせずにステージング | git cherry-pick -n abc1234 |
-x | 元コミット情報を記録 | git cherry-pick -x abc1234 |
-e, --edit | コミットメッセージを編集 | git cherry-pick -e abc1234 |
--continue | コンフリクト解決後に継続 | git cherry-pick --continue |
--abort | cherry-pickを中断 | git cherry-pick --abort |
🔧 実践的な使用例
ケース1: 単一コミットの適用
シナリオ: 機能ブランチで修正したバグをリリースブランチにも適用する
# 1. 現在の状態を確認
$ git status
On branch release/v1.2
nothing to commit, working tree clean
# 2. 適用したいコミットを確認
$ git log --oneline feature/bugfix
def5678 Fix memory leak in data processing
abc1234 Add new validation logic
9876543 Initial feature implementation
# 3. バグ修正のコミットのみをcherry-pick
$ git cherry-pick def5678
[release/v1.2 1a2b3c4] Fix memory leak in data processing
Date: Wed Jan 16 10:15:30 2025 +0900
2 files changed, 8 insertions(+), 3 deletions(-)
# 4. 結果を確認
$ git log --oneline -3
1a2b3c4 (HEAD -> release/v1.2) Fix memory leak in data processing
7f8e9d0 Prepare for v1.2 release
6c5b4a3 Update version number
ポイント:
- 必要なコミットのみを選択的に適用
- 新しいコミットハッシュが生成される(def5678 → 1a2b3c4)
- コミットメッセージは自動的にコピーされる
ケース2: 複数コミットの連続適用
シナリオ: 実験ブランチから複数の関連するコミットを本流に取り込む
# 1. 適用したいコミット範囲を確認
$ git log --oneline experimental
789abcd Add performance optimization
456def0 Refactor calculation logic
123abc9 Fix edge case in algorithm
fedcba9 Initial experimental changes
# 2. 範囲を指定してcherry-pick
$ git cherry-pick 123abc9..789abcd
[main 9e8d7c6] Fix edge case in algorithm
1 file changed, 5 insertions(+), 2 deletions(-)
[main 8d7c6b5] Refactor calculation logic
2 files changed, 15 insertions(+), 8 deletions(-)
[main 7c6b5a4] Add performance optimization
1 file changed, 12 insertions(+), 4 deletions(-)
# 3. 結果を確認
$ git log --oneline -5
7c6b5a4 (HEAD -> main) Add performance optimization
8d7c6b5 Refactor calculation logic
9e8d7c6 Fix edge case in algorithm
2b1a9c8 Previous main commit
1a9c8d7 Earlier main commit
ポイント:
start..end
形式で範囲指定可能- 複数のコミットが順番に適用される
- 各コミットで個別にコンフリクトが発生する可能性がある
ケース3: コンフリクトを伴うcherry-pick
シナリオ: コンフリクトが発生した場合の解決手順
# 1. cherry-pickを実行してコンフリクトが発生
$ git cherry-pick abc1234
error: could not apply abc1234... Update user validation
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 commit'
Auto-merging src/validation.js
CONFLICT (content): Merge conflict in src/validation.js
# 2. コンフリクトの内容を確認
$ git status
On branch main
You are currently cherry-picking commit abc1234.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/validation.js
# 3. ファイルを手動で編集してコンフリクトを解決
$ git add src/validation.js
# 4. cherry-pickを継続
$ git cherry-pick --continue
[main 5f4e3d2] Update user validation
Date: Thu Jan 17 15:20:45 2025 +0900
1 file changed, 10 insertions(+), 5 deletions(-)
ポイント:
- コンフリクト発生時は手動解決が必要
--continue
で処理を継続、--abort
で中断可能- 解決後は通常のコミットと同様に動作
🔍 トラブルシューティング
エラー1: “error: could not apply [commit]”
エラー内容:
error: could not apply abc1234... Fix user authentication
hint: after resolving the conflicts, mark the corrected paths
原因:
- コミットの変更内容が現在のブランチの状態と競合している
- 同じファイルの同じ箇所に異なる変更が加えられている
解決方法:
# コンフリクト箇所を確認
$ git status
$ git diff
# ファイルを編集してコンフリクトを手動解決
$ vim src/conflicted-file.js
# 解決したファイルをステージング
$ git add src/conflicted-file.js
# cherry-pickを継続
$ git cherry-pick --continue
エラー2: “fatal: bad revision [commit]”
エラー内容:
fatal: bad revision 'abc1234'
原因:
- 指定したコミットハッシュが存在しない
- ハッシュの入力ミスまたは不完全な指定
解決方法:
# 正しいコミットハッシュを確認
$ git log --oneline
# 存在するコミットで再実行
$ git cherry-pick 正しいハッシュ値
エラー3: “error: your local changes would be overwritten”
エラー内容:
error: your local changes to the following files would be overwritten by cherry-pick
原因:
- ワーキングディレクトリに未コミットの変更がある
- cherry-pickする内容と競合する可能性がある
解決方法:
# 変更を一時保存
$ git stash
# cherry-pickを実行
$ git cherry-pick abc1234
# 必要に応じて変更を復元
$ git stash pop
トラブル予防のチェックリスト
- [ ] コミット前に必ず
git status
で確認 - [ ] cherry-pick前にワーキングディレクトリをクリーンにする
- [ ] 適用先ブランチが正しいか確認
- [ ] コミットハッシュの存在を事前確認
💡 ベストプラクティス
1. -xオプションでトレーサビリティを確保
推奨される方法:
# Good ✅
git cherry-pick -x abc1234
避けるべき方法:
# Bad ❌
git cherry-pick abc1234
理由: -xオプションを使用すると、コミットメッセージに元のコミット情報が自動記録され、後から追跡しやすくなります。
2. チーム開発での活用法
- ルール1: cherry-pickしたコミットには必ず元コミット情報を記録する(-xオプション使用)
- ルール2: 重要な修正は関係者にcherry-pickの実行を事前通知する
- ルール3: リリースブランチへのcherry-pickはレビューを必須とする
3. 自動化とエイリアス設定
[alias]
cp = cherry-pick
cpx = cherry-pick -x
cpe = cherry-pick --edit
cpc = cherry-pick --continue
cpa = cherry-pick --abort
# 使用例
$ git cpx abc1234 # -xオプション付きcherry-pick
$ git cpc # コンフリクト解決後の継続
📊 コマンドオプション完全リファレンス
主要オプション詳細
オプション一覧を展開
オプション | 長い形式 | 説明 | 使用例 |
---|---|---|---|
-n | --no-commit | コミットを作成しない | git cherry-pick -n abc1234 |
-x | 元コミット情報を記録 | git cherry-pick -x abc1234 | |
-e | --edit | コミットメッセージ編集 | git cherry-pick -e abc1234 |
-s | --signoff | Signed-off-by行を追加 | git cherry-pick -s abc1234 |
-m | --mainline | マージコミット時の親指定 | git cherry-pick -m 1 abc1234 |
--continue | コンフリクト解決後継続 | git cherry-pick --continue | |
--abort | 操作を中断 | git cherry-pick --abort | |
--quit | 状態をリセット | git cherry-pick --quit |
オプションの組み合わせパターン
目的 | コマンド例 | 効果 |
---|---|---|
安全なcherry-pick | git cherry-pick -x -e abc1234 | 履歴記録+メッセージ編集 |
複数コミット準備 | git cherry-pick -n abc1234 def5678 | 複数コミットをまとめて適用準備 |
マージコミット適用 | git cherry-pick -m 1 abc1234 | マージコミットの特定の親を選択 |
🎯 実践演習
演習1: 基本的なcherry-pick操作
課題: developブランチのバグ修正コミットをmainブランチに適用してください
解答を見る
# 解答例
$ git checkout main
$ git log --oneline develop | grep "Fix bug"
abc1234 Fix bug in payment processing
$ git cherry-pick -x abc1234
$ git log --oneline -1
def5678 (HEAD -> main) Fix bug in payment processing
解説: -x
オプションで元コミットの履歴を残すことで、後からトレースしやすくなります。
演習2: コンフリクト解決演習
課題: コンフリクトが発生したcherry-pickを適切に解決してください
解答を見る
# 解答例
$ git cherry-pick abc1234
# コンフリクト発生
$ git status
# コンフリクトファイルを確認
$ vim src/conflicted-file.js
# 手動でコンフリクトを解決
$ git add src/conflicted-file.js
$ git cherry-pick --continue
解説: コンフリクト解決の基本は、手動編集→add→continue の流れです。--abort
で中断も可能です。
🔗 関連リソース
公式ドキュメント
関連記事
次に学ぶべきコマンド
- git revert: コミットを安全に取り消す方法
- git rebase -i: インタラクティブなコミット編集
- git reflog: 操作履歴の確認と復旧
📌 まとめ
この記事で学んだこと
- ✅ git cherry-pickの基本的な使い方と動作原理
- ✅ 単一・複数コミットの効率的な適用方法
- ✅ コンフリクト発生時の適切な解決手順
- ✅ チーム開発でのベストプラクティス
- ✅ トラブルシューティングと予防策
重要なポイントの再確認
- 基本: cherry-pickは選択的コミット適用で、新しいコミットを作成する
- 応用: -xオプションで履歴の追跡可能性を確保する
- 注意: コンフリクト時は慎重に手動解決し、必要に応じて –abort する
実務での活用チェックリスト
- [ ] 基本的なcherry-pickコマンドをマスターした
- [ ] -x, -e, -n等の主要オプションを覚えた
- [ ] コンフリクト解決の手順を理解した
- [ ] チームでのcherry-pickルールを確認した
- [ ] 便利なエイリアスを設定した
🚀 次のステップ
gitのcherry-pickをマスターしたら、次はgit revertやgit rebase -iといった、より高度なコミット操作コマンドも学んでいきましょう。特にgit revertとの使い分けを理解することで、より安全で効率的なGit操作が可能になります。
実際のプロジェクトで積極的に使って、体で覚えていくことが上達への近道です。困ったときはこの記事に戻って、トラブルシューティングセクションを参照してください。
Happy Git Life! 🎉