🍒
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