1. `cherry-pick`とは?
`git cherry-pick`は、**他のブランチにある特定のコミット1つだけ**を、現在のブランチにコピーして取り込むためのコマンドです。ブランチ全体をマージ(統合)したくはないけれど、その中の一部の変更だけが必要な場合に非常に役立ちます。
例えるなら「リンゴのつまみ食い」
隣の木になっているリンゴ(コミット)の中から、一番美味しそうなもの1つだけを収穫して、自分のカゴ(現在のブランチ)に入れるようなイメージです。
2. 仕組み
`cherry-pick`はコミットを「移動」させるのではなく、「コピー」します。具体的には、以下の処理が行われます。
- 指定されたコミットの**変更内容(パッチ)**を抽出します。
- 現在のブランチの先頭に、その変更内容を適用します。
- 同じ変更内容を持つ**新しいコミット**を作成します。この新しいコミットは、元のコミットとは異なるコミットハッシュ値を持ちます。
3. インタラクティブ・シミュレーション
`feature`ブランチで修正された「重大なバグ」のコミットだけを、`main`ブランチに取り込んでみましょう。
main ブランチ
feature ブランチ
1. `feature`ブランチからコミットを選択
コミットが選択されていません
4. 主なユースケース
緊急のバグ修正(ホットフィックス)
開発中のブランチで行ったバグ修正を、すぐに本番環境用の`main`ブランチにも適用したい場合。
機能の一部だけを先行リリース
大きな機能開発ブランチの中から、完成した一部のコミットだけを先にリリース用ブランチに取り込みたい場合。
不要なマージコミットを避ける
他のブランチの変更を少しだけ取り込みたいが、そのためだけにブランチ全体をマージしたくない場合。
間違ったブランチへのコミット修正
間違ったブランチにコミットしてしまった際に、そのコミットを正しいブランチにコピーし、元のコミットをリセットで取り消す場合。
5. 注意点
コミットの重複
`cherry-pick`は新しいコミットを作成するため、後で元のブランチをマージすると、同じ変更内容を持つコミットが歴史上に2つ存在することになります。これにより、歴史が少し読みにくくなる可能性があります。
コンフリクト(競合)
取り込もうとしているコミットの変更内容が、現在のブランチのコードと競合(コンフリクト)する場合があります。その際は、手動でコンフリクトを解決する必要があります。