🍒
Gitのcherry-pickを使いこなす:特定のコミットだけを別ブランチに適用する方法
git cherry-pickは、特定のコミットを別のブランチに適用したい場合に便利なコマンドです。全ての変更をマージする必要がない場合、または特定の修正だけを取り込みたい場合に使用します。
例えば、「バグ修正だけを本番ブランチに適用したい」といった場面で活躍します。
🛠️ git cherry-pickの基本の書き方
git cherry-pick <コミットハッシュ>
-
<コミットハッシュ>は適用したいコミットのIDです。
複数のコミットを同時に適用する場合:
git cherry-pick <コミットハッシュ1> <コミットハッシュ2> ...
または、連続したコミットを範囲指定する場合:
git cherry-pick <開始コミットハッシュ>^..<終了コミットハッシュ>
✅ 例developブランチからの修正する時
ブランチ構成
以下のようなブランチで作業をしているとします。
a --- b --- c --- d (develop)
\
e --- f --- g --- h (fix)
-
developブランチ:メインの開発ブランチ。 -
fixブランチ:バグ修正用のブランチ。 -
e,f,g,h:バグ修正に関するコミット。
やりたい事
fixブランチの**gコミット**だけをdevelopブランチに適用したいとします。
具体的な手順
-
developブランチに移動git checkout develop -
適用したいコミットの確認
git log --oneline --graph --all出力例:
h890123 (fix) 修正4 g789012 修正3 ← これをcherry-pickしたい f456789 修正2 e123456 修正1 d987654 開発機能4 c654321 開発機能3 b321098 開発機能2 a123987 初回コミット -
cherry-pickを実行git cherry-pick g789012
⚠️ マージコンフリクト(競合)の発生する場合
先ほどの例でgコミットが**eやfコミットに依存していると、直接適用できずコンフリクト**が発生します。
エラーメッセージの例
error: could not apply g789012... 修正3
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 cherry-pick --continue'
🛠️ コンフリクトの解決手順
-
競合状態を確認
git status出力例:
On branch develop You are currently cherry-picking commit g789012. Unmerged paths: (use "git add <file>..." to mark resolution) both modified: src/app.js -
競合箇所を修正
ファイル内の競合部分は以下のように表示されます:
<<<<<<< HEAD 開発ブランチの変更 ======= gコミットの変更内容 >>>>>>> g789012→ 手動で競合部分を修正し、不要なマーカーを削除します。
-
修正したファイルをステージング
git add src/app.ts -
cherry-pickの続行
git cherry-pick --continue -
もし中断したい場合
git cherry-pick --abort
🧠 競合を回避するためのポイント
-
依存関係を確認する:
gコミットがeやfの変更に依存している場合、その前のコミットも取り込む必要があるか検討します。 -
複数コミットをまとめてcherry-pick:
e,f,gの変更が密接に関連している場合、一連のコミットをまとめて適用する方が安全です。git cherry-pick e123456^..g789012
🤔 git cherry-pickを利用ケースと注意点
✅ 利用ケース
- ブランチ元を変えたい時(rebaseの方が良いとは思います)
- 緊急のバグ修正を本番環境に反映したいとき。
- 特定の機能や修正だけを別ブランチに取り込みたい場合。
⚠️ 注意点
- コミット履歴が複雑化することがある → 履歴をきれいに保ちたい場合は慎重に。
-
マージコミットはそのままcherry-pickできない → 必要なら
-mオプションを使う。 -
依存関係を確認する:
cherry-pickするコミットが前のコミットに依存している場合は、競合が発生しやすくなります。
git cherry-pickは、特定のコミットだけを別ブランチに適用したい場合に便利です。しかし、依存関係のあるコミットを選ぶと競合が発生しやすいびで注意は必要です。コミットの関係性を把握した上で慎重に作業しましょう。
Discussion