チェリーピックとは?
チェリーピック(cherry-pick)は、特定のコミットを選んで現在のブランチに適用する操作です。まるでサクランボを一つずつ摘むように、必要なコミットだけを選択できます。
こんな時に便利
🚑 緊急修正の適用
- 「developブランチのバグ修正を本番環境にすぐ適用したい」
- 「でも、developの他の変更はまだリリースしたくない」
🔄 変更の再利用
- 「別のブランチで作った機能を現在のブランチでも使いたい」
- 「間違ったブランチにコミットしてしまった」
🎯 選択的な統合
- 「長期開発ブランチから特定の改善だけを取り込みたい」
- 「実験的な変更の一部だけを採用したい」
基本的な使い方
1. 単一コミットのcherry-pick
# 特定のコミットを現在のブランチに適用
git cherry-pick <commit-hash>
# 例
git cherry-pick abc1234
2. 複数コミットのcherry-pick
# 範囲指定(開始は含まれない)
git cherry-pick <start-commit>..<end-commit>
# 複数の個別コミット
git cherry-pick commit1 commit2 commit3
3. オプション
# コミットせずに変更だけ適用
git cherry-pick -n <commit-hash>
# コミットメッセージを編集
git cherry-pick -e <commit-hash>
# 元のコミット情報を追加
git cherry-pick -x <commit-hash>
cherry-pick中のコンフリクト
コンフリクトが発生した場合
# 1. コンフリクトを解決
# 2. 変更をステージング
git add resolved-file.js
# 3. cherry-pickを続行
git cherry-pick --continue
# または中止
git cherry-pick --abort
実践的な使用例
シナリオ1: バグ修正の選択的適用
# developブランチでバグ修正
git checkout develop
# ... バグ修正のコミット (commit: fix123) ...
# mainブランチに修正だけ適用
git checkout main
git cherry-pick fix123
シナリオ2: 間違ったブランチへのコミットを修正
# 間違ってmainにコミット
git checkout main
# ... 機能追加 (commit: feat456) ...
# 正しいブランチに移動
git checkout feature/new-feature
git cherry-pick feat456
# mainから削除
git checkout main
git reset --hard HEAD~1
シナリオ3: 複数ブランチへの同じ修正
# セキュリティ修正を複数のリリースブランチに適用
git checkout release/v1.0
git cherry-pick security-fix
git checkout release/v2.0
git cherry-pick security-fix
git checkout release/v3.0
git cherry-pick security-fix
cherry-pickの注意点
1. コミットの重複
cherry-pickは新しいコミットを作成するため、同じ変更が異なるコミットIDで存在することになります。
Original: A---B---C---D develop
↓
E---F---C'---G main (C' is cherry-picked C)
2. 依存関係の考慮
コミットが他のコミットに依存している場合、cherry-pickが失敗したり、バグを引き起こす可能性があります。
3. マージ時の問題
cherry-pickしたコミットを含むブランチをマージする際、同じ変更が重複して適用される可能性があります。
ベストプラクティス
1. -xオプションの使用
# 元のコミット情報を記録
git cherry-pick -x abc1234
# コミットメッセージに以下が追加される:
# (cherry picked from commit abc1234)
2. 関連コミットをまとめて適用
# 機能に関連する全てのコミットを確認
git log --oneline --grep="feature-x"
# 順番に適用
git cherry-pick commit1 commit2 commit3
3. テストの実施
# cherry-pick後は必ずテストを実行
git cherry-pick fix123
npm test
実践演習
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
cherry-pickとその他の方法の比較
方法 | 使用場面 | メリット | デメリット |
---|---|---|---|
cherry-pick | 特定のコミットだけ必要 | 柔軟で簡単 | コミットの重複 |
merge | ブランチ全体を統合 | 履歴が保持される | 不要な変更も含まれる |
rebase | 履歴を整理したい | きれいな履歴 | 既存のコミットを変更 |
まとめ
cherry-pickは、特定の変更だけを別のブランチに適用したい場合に非常に便利なツールです。ただし、コミットの重複や依存関係には注意が必要です。適切に使用することで、柔軟な変更管理が可能になります。
次のレッスンでは、作業中の変更を一時的に保存する「スタッシュ」について学びます。