git cherry-pick の使い方と注意点
はじめに
Gitを使っていて「このコミットだけ他のブランチに反映させたい」という場面に遭遇したことはありませんか?
そんなときに役立つのが git cherry-pick
です。
本記事では、git cherry-pick
の基本的な使い方と注意点を解説します。
git cherry-pick
とは
1. git cherry-pick
は、指定した1つまたは複数のコミットだけを現在のブランチに適用するコマンドです。
git cherry-pick <コミットID>
例えば、main
ブランチで以下のようなコミット履歴があったとします。
* abc1234 バグ修正:ログ出力のタイポ修正
* ...
特定のコミット(abc1234
)だけを feature
ブランチにも取り込みたい場合は、次のように実行します。
git switch feature # 作業中のブランチに切り替え(古いGitでは git checkout feature と書く場合もあります)
git cherry-pick abc1234 # mainブランチにあるコミット abc1234 を feature ブランチに適用
このように、必要な修正だけを他のブランチに反映したいときに便利です。
適用されたコミットは、まったく同じ内容でも新しいコミットID(SHA) で記録されます。
2. 使用する場面
- 他のブランチで修正されたバグだけを反映させたい
- 緊急で公開しなければならないバグ修正(ホットフィックス) を、他のブランチにも適用したい
- 複数ブランチで一部の処理だけを共有したい
こうした「一部だけを取り込みたい」という場面で活躍します。
💡 ホットフィックスとは:「今すぐ直さないと困るバグ」を急いで修正することを指します。
例えば、本番環境でアプリが動かなくなった場合、その場しのぎでもいいから早急に直して公開するような修正がホットフィックスです。
ただし、「一部だけ取り込みたい」状況が頻発する場合は、
そもそものブランチ戦略を見直した方が良いかもしれません。
cherry-pick
する
3. 複数コミットをまとめて 連続する複数のコミットを一括で適用したい場合は、以下のように範囲を指定します。
git cherry-pick <開始ID>^..<終了ID>
例:
git cherry-pick abc1234^..def5678
この書き方では、以下の 3つのコミット全て が適用されます。
abc1234
bcd2345
def5678
abc1234^..def5678
のように^
を付けると、abc1234
からdef5678
まで指定できます。
^
を付けないと、abc1234
は含まれず、bcd2345
とdef5678
の2件のみになります。
4. コンフリクトが発生した場合
cherry-pick
でも、merge
や rebase
と同様にコンフリクトが発生することがあります。
その際の対応は以下のとおりです。
# コンフリクト箇所を手動で修正したら、
git add . # 修正済みファイルをステージに追加
git cherry-pick --continue # cherry-pick を続行
もし取り消したい場合は、以下のコマンドを実行します。
git cherry-pick --abort
5. 注意点と落とし穴
注意点 | 説明 |
---|---|
内容は同じでも、履歴としては新しいコミットとして記録される |
cherry-pick されたコミットは新しいSHAで再生成されます(clone ではなく再作成) |
履歴が分かりにくくなる | 同じ内容のコミットが複数のブランチに分散すると、履歴の把握や管理が難しくなります |
コンフリクト対応が必要 |
merge や rebase と同じように手動解決が必要になることがあります |
おわりに
git cherry-pick
は、他のブランチからピンポイントで修正を持ってきたいときに非常に便利なコマンドです。
ただし、履歴が複雑になりやすく、トラブルのもとにもなりかねません。
「本当に cherry-pick
が最善か?」 を考えてから使うようにすると、後の混乱を防げます。
本記事が参考になれば幸いです。
Discussion