🔖

git cherry-pick の使い方と注意点

に公開

はじめに

Gitを使っていて「このコミットだけ他のブランチに反映させたい」という場面に遭遇したことはありませんか?

そんなときに役立つのが git cherry-pick です。

本記事では、git cherry-pick の基本的な使い方と注意点を解説します。

1. git cherry-pick とは

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. 使用する場面

  • 他のブランチで修正されたバグだけを反映させたい
  • 緊急で公開しなければならないバグ修正(ホットフィックス) を、他のブランチにも適用したい
  • 複数ブランチで一部の処理だけを共有したい

こうした「一部だけを取り込みたい」という場面で活躍します。

💡 ホットフィックスとは:「今すぐ直さないと困るバグ」を急いで修正することを指します。
例えば、本番環境でアプリが動かなくなった場合、その場しのぎでもいいから早急に直して公開するような修正がホットフィックスです。

ただし、「一部だけ取り込みたい」状況が頻発する場合は、
そもそものブランチ戦略を見直した方が良いかもしれません。

3. 複数コミットをまとめて cherry-pick する

連続する複数のコミットを一括で適用したい場合は、以下のように範囲を指定します。

git cherry-pick <開始ID>^..<終了ID>

例:

git cherry-pick abc1234^..def5678

この書き方では、以下の 3つのコミット全て が適用されます。

  • abc1234
  • bcd2345
  • def5678

abc1234^..def5678 のように ^ を付けると、abc1234 から def5678 まで指定できます。
^ を付けないと、abc1234 は含まれず、bcd2345def5678 の2件のみになります。

4. コンフリクトが発生した場合

cherry-pick でも、mergerebase と同様にコンフリクトが発生することがあります。

その際の対応は以下のとおりです。

# コンフリクト箇所を手動で修正したら、
git add .  # 修正済みファイルをステージに追加
git cherry-pick --continue  # cherry-pick を続行

もし取り消したい場合は、以下のコマンドを実行します。

git cherry-pick --abort

5. 注意点と落とし穴

注意点 説明
内容は同じでも、履歴としては新しいコミットとして記録される cherry-pick されたコミットは新しいSHAで再生成されます(cloneではなく再作成)
履歴が分かりにくくなる 同じ内容のコミットが複数のブランチに分散すると、履歴の把握や管理が難しくなります
コンフリクト対応が必要 mergerebase と同じように手動解決が必要になることがあります

おわりに

git cherry-pick は、他のブランチからピンポイントで修正を持ってきたいときに非常に便利なコマンドです。

ただし、履歴が複雑になりやすく、トラブルのもとにもなりかねません。
「本当に cherry-pick が最善か?」 を考えてから使うようにすると、後の混乱を防げます。

本記事が参考になれば幸いです。

Discussion