Git cherry-pickとは?特定のコミットだけを取り込む方法を初心者向けに解説
Git cherry-pickの基本的な使い方と実践的な活用方法を初心者向けに解説します。別ブランチの特定のコミットだけを取り込みたいときに便利なcherry-pickコマンドの仕組みと注意点を学びましょう。
Git cherry-pickとは
Git cherry-pickは、別のブランチにある特定のコミットを現在のブランチに取り込むコマンドです。ブランチ全体をマージするのではなく、必要なコミットだけを選んで適用できます。
たとえば、featureブランチで作成したバグ修正コミットを、mainブランチにも適用したい場合に使います。マージやリベースとは異なり、特定の変更だけをピンポイントで取り込めるのが特徴です。
cherry-pickの仕組み
cherry-pickは指定したコミットの変更内容を「コピー」して、現在のブランチに新しいコミットとして作成します。元のコミットとcherry-pickで作られたコミットは、内容は同じですがコミットハッシュは異なります。
上の図では、featureブランチのコミットCをmainブランチにcherry-pickしています。CとC'は同じ変更内容ですが、別のコミットとして存在します。
cherry-pickの基本的な使い方
単一のコミットを取り込む
まず、取り込みたいコミットのハッシュを確認します。
git log --oneline feature
出力例:
d4e5f6g 機能Bを追加
a1b2c3d バグを修正 ← このコミットを取り込みたい
9f8e7d6 機能Aを追加
次に、取り込み先のブランチに切り替えてcherry-pickを実行します。
git checkout main
git cherry-pick a1b2c3d
これでfeatureブランチの「バグを修正」コミットがmainブランチに適用されます。
複数のコミットを取り込む
複数のコミットを連続して取り込む場合は、コミットハッシュを並べて指定します。
git cherry-pick a1b2c3d d4e5f6g
範囲指定も可能です。ただし、開始コミットは含まれないことに注意してください。
# 9f8e7d6の次のコミットからd4e5f6gまでを取り込む
git cherry-pick 9f8e7d6..d4e5f6g
開始コミットも含めたい場合は ^ を付けます。
# 9f8e7d6からd4e5f6gまでを取り込む(9f8e7d6も含む)
git cherry-pick 9f8e7d6^..d4e5f6g
よく使うオプション
cherry-pickにはいくつかの便利なオプションがあります。
| オプション | 説明 |
|---|---|
-n または --no-commit | コミットせずに変更だけをステージングエリアに適用する |
-e または --edit | コミットメッセージを編集してからコミットする |
-x | コミットメッセージに元のコミットハッシュを追記する |
--continue | コンフリクト解消後にcherry-pickを続行する |
--abort | cherry-pickを中止して元の状態に戻る |
コミットせずに変更を取り込む
-nオプションを使うと、変更内容だけを取り込んでコミットは作成しません。複数のコミットをまとめて1つのコミットにしたい場合に便利です。
git cherry-pick -n a1b2c3d
git cherry-pick -n d4e5f6g
git commit -m "featureブランチから必要な変更を取り込み"
元のコミット情報を記録する
-xオプションを使うと、コミットメッセージに元のコミットハッシュが自動で追記されます。どこからcherry-pickしたか後で追跡しやすくなります。
git cherry-pick -x a1b2c3d
コミットメッセージの例:
バグを修正
(cherry picked from commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6)
コンフリクトが発生した場合の対処
cherry-pick中にコンフリクトが発生することがあります。これは、取り込もうとしている変更が現在のブランチの内容と競合している場合に起こります。
コンフリクト解消の手順
- コンフリクトが発生したファイルを確認します。
git status
-
コンフリクトマーカー(
<<<<<<<、=======、>>>>>>>)を手動で編集して解消します。 -
解消したファイルをステージングします。
git add <解消したファイル>
- cherry-pickを続行します。
git cherry-pick --continue
途中でcherry-pickをやめたい場合は、--abortで中止できます。
git cherry-pick --abort
初心者が混乱しやすいポイント
cherry-pickとmergeの違い
cherry-pickとmergeはどちらも別ブランチの変更を取り込む操作ですが、目的が異なります。
| 操作 | 取り込む範囲 | 主な用途 |
|---|---|---|
| merge | ブランチ全体の変更 | feature完了後の統合 |
| cherry-pick | 選択したコミットのみ | 特定の変更だけを適用 |
mergeはブランチ全体を統合するため、そのブランチのすべてのコミットが取り込まれます。一方、cherry-pickは必要なコミットだけを選んで取り込めます。
同じコミットを複数回cherry-pickできる?
同じコミットを別々のブランチにcherry-pickすることは可能です。ただし、それぞれ異なるコミットハッシュで作成されます。
注意点として、cherry-pickしたブランチ同士を後でマージすると、同じ変更が2回適用されてコンフリクトが発生する可能性があります。
cherry-pickは履歴を書き換えない
cherry-pickは元のコミットを移動させるのではなく、コピーして新しいコミットを作成します。元のブランチのコミット履歴は変更されません。
これは安全な操作である反面、同じ変更が複数のブランチに存在することになります。大量のコミットを取り込む場合は、mergeやrebaseの方が適切なケースもあります。
実践的な活用シーン
ホットフィックスの適用
本番環境で緊急のバグ修正が必要になった場合、開発ブランチで作成した修正コミットをmainブランチにcherry-pickで素早く適用できます。
# mainブランチに緊急修正を適用
git checkout main
git cherry-pick <修正コミットのハッシュ>
git push origin main
リリースブランチへの特定機能の追加
リリース予定のブランチに、開発中の特定の機能だけを含めたい場合にもcherry-pickが便利です。
git checkout release/v2.0
git cherry-pick <機能Aのコミット>
git cherry-pick <機能Bのコミット>
誤ったブランチへのコミットを修正
間違って別のブランチにコミットしてしまった場合、正しいブランチにcherry-pickしてから元のコミットを取り消すことができます。
# 正しいブランチにコミットをコピー
git checkout correct-branch
git cherry-pick <誤ったコミットのハッシュ>
# 誤ったブランチからコミットを削除
git checkout wrong-branch
git reset --hard HEAD~1
cherry-pickを使う際の注意点
cherry-pickは便利ですが、使いすぎると問題が発生することがあります。
| 注意点 | 詳細 |
|---|---|
| 履歴の重複 | 同じ変更が複数ブランチに存在し、後のマージで問題になる可能性がある |
| 依存関係の欠落 | 前後のコミットに依存している変更は、単独でcherry-pickすると動作しないことがある |
| 追跡の困難さ | -xオプションを使わないと、どこからcherry-pickしたか分からなくなる |
cherry-pickは「例外的に使うコマンド」と考え、基本的にはmergeやrebaseでブランチを統合することをおすすめします。
まとめ
Git cherry-pickは、別ブランチの特定のコミットだけを現在のブランチに取り込むコマンドです。
- 基本構文は
git cherry-pick <コミットハッシュ> - 複数コミットの取り込みや範囲指定も可能
-nオプションでコミットせずに変更だけを適用できる-xオプションで元のコミット情報を記録できる- コンフリクト発生時は解消後に
--continueで続行
ホットフィックスの適用や特定機能のみの取り込みなど、ピンポイントで変更を適用したい場面でcherry-pickは大いに役立ちます。ただし、使いすぎると履歴が複雑になるため、基本はmergeやrebaseを使い、必要なときだけcherry-pickを活用しましょう。
編集部