Gitでの開発作業をしていると、特定のコミットだけを別のブランチに反映させたい場面が出てきます。例えば、バグ修正をmainブランチで行った後に、それと同じ修正をreleaseブランチにも適用したい場合などです。
そんなときに便利なのが「git cherry-pick」コマンドです。このコマンドを使えば、特定のコミットだけを別のブランチに取り込むことができます。この記事では、git cherry-pick
の基本的な使い方から、複数コミットの適用方法、競合の対処法までをわかりやすく解説します。Git初心者の方にも理解しやすいように、実際の使用例とともに丁寧に説明していきます。
git cherry-pickとは?
git cherry-pick
とは、他のブランチで行われた特定のコミットを現在のブランチに適用するGitのコマンドです。通常のマージやリベースとは異なり、必要なコミットだけを選んで取り込む点が特徴です。
たとえば、次のような状況を考えてみましょう:
mainブランチ: A - B - C - D
featureブランチ: E - F - G
このとき、main
の「コミットC」だけをfeature
ブランチに取り込みたい場合に、git cherry-pick
が使えます。結果として、featureブランチに「Cと同じ変更内容を含む新たなコミット」が追加されます。
基本的な使い方
1. 対象のコミットハッシュを確認する
まずは適用したいコミットのハッシュ値を確認します。以下のコマンドで履歴を表示しましょう。
git log --oneline
実行例:
e3a1b3d 修正:フォームのバリデーション追加
1a2b3c4 機能追加:ログイン処理
d5e6f7g バグ修正:APIエンドポイント修正
ここで「フォームのバリデーション追加」のコミット(e3a1b3d
)を取り込みたいとします。
2. cherry-pickコマンドを実行する
git checkout feature
git cherry-pick e3a1b3d
これにより、mainブランチで行われた「フォームのバリデーション追加」が、featureブランチに新しいコミットとして適用されます。
複数のコミットをまとめてcherry-pickする
複数のコミットを一度にcherry-pickすることも可能です。範囲を指定するには、次のように記述します。
git cherry-pick <開始ハッシュ>^..<終了ハッシュ>
例:
git cherry-pick 1a2b3c4^..e3a1b3d
このようにすることで、1a2b3c4からe3a1b3dまでの3つのコミットをまとめて現在のブランチに適用できます。
cherry-pickで競合が発生した場合の対処法
git cherry-pick
では、対象のコミットが現在のブランチと衝突する場合、**コンフリクト(競合)**が発生します。競合が起きた場合は、Gitが以下のようなエラーメッセージを表示します:
error: could not apply e3a1b3d... 修正:フォームのバリデーション追加
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
対処手順:
- 対象ファイルをエディタで開き、マークされた競合箇所を修正。
- 修正が完了したら、
git add
でステージングします。 - 最後に以下のコマンドでcherry-pickを続行します。
git cherry-pick --continue
もし中止したい場合は、以下のコマンドを使用します。
git cherry-pick --abort
注意点:cherry-pickは新しいコミットを作成する
git cherry-pick
で適用したコミットは、元のコミットとは別のIDを持つ新しいコミットとして記録されます。これは、履歴が複製されるのではなく、あくまで同じ変更内容を新しく追加しているためです。
そのため、同じ内容を複数のブランチで持つ場合、後のマージ作業で「重複する変更」に注意が必要です。
実践的な使用シーン
以下は、git cherry-pick
が活躍する代表的なシーンです:
- バグ修正の適用
mainで修正したバグを、すぐにreleaseブランチにも反映させたいとき。 - 緊急対応
featureブランチで対応した修正を一時的にhotfixブランチへ適用する。 - 一部だけ取り込みたいとき
featureブランチで試作した変更の中から、一部だけmainに取り込みたい場合。
よく使うオプション
オプション | 説明 |
---|---|
--edit | コミットメッセージを編集できるようにする |
--no-commit | 作業ツリーとインデックスに変更を適用するが、コミットはしない |
--signoff | コミットメッセージに「Signed-off-by」署名を追加する |
例:
git cherry-pick --no-commit e3a1b3d
このようにすると、一度ステージングされ、手動で内容を確認してからコミットできます。
まとめ
git cherry-pick
は、特定のコミットだけを他のブランチに適用したいときに非常に便利なコマンドです。複数人で開発していると、「この変更だけ今のブランチに欲しい」といったケースが多々あります。そのたびにマージやリベースを使うのではなく、必要な部分だけをスマートに取り込めるのがcherry-pickの魅力です。
ただし、便利な反面、使いすぎると履歴が複雑になったり、意図しない競合が発生するリスクもあるため、使いどころを意識することも大切です。
開発現場でうまく活用できれば、作業効率がグッと上がること間違いなしです。まだ使ったことがない方も、ぜひ試してみてください。