応用

git cherry-pick

特定のコミットだけを選んで、現在のブランチに取り込みます。ブランチ全体をマージせず、必要な変更だけを持ってきたいときに使います。

構文 git cherry-pick [options] <commit>...

オプション

フラグ 説明
-n / --no-commit 変更を作業ツリーとステージングエリアに適用しますが、コミットは作成しません。複数のコミットをまとめて1つのコミットにしたいときに使います。
-x コミットメッセージの末尾に元のコミットハッシュを自動で追記します。取り込み元を後から追跡しやすくなります。
--abort 進行中の cherry-pick を中断し、実行前の状態に戻します。
--continue コンフリクト解決後に cherry-pick を再開します。
--edit コミットを取り込む前にコミットメッセージを編集する画面を開きます。

git cherry-pick は、別のブランチにある特定のコミットだけを選んで、現在のブランチに取り込むコマンドです。ブランチ全体を mergerebase するほどではないが、その中の1つの修正だけがほしい、というときに使います。

基本的な使い方

# 対象のコミットハッシュを他ブランチの log で確認
git log other-branch --oneline

# 現在のブランチにそのコミットだけを取り込む
git cherry-pick a1b2c3d
【取り込み前】
main:          A → B
other-branch:  A → B → C → D

【git cherry-pick D 実行後】
main:          A → B → D'
other-branch:  A → B → C → D

D'D と同じ変更内容を持つ新しいコミットとして main に追加されます。コミットハッシュは変わります。

よくある使いどころ:hotfix を複数ブランチに反映する

# hotfix ブランチで緊急修正
git switch hotfix/urgent-bug
git commit -m "認証バグを修正"
# コミットハッシュ: f9e8d7c

# main に取り込む
git switch main
git cherry-pick f9e8d7c

# リリースブランチにも同じ修正を取り込む
git switch release/v1.2
git cherry-pick f9e8d7c

複数のコミットをまとめて取り込む

# 複数のコミットを個別に取り込む(それぞれ別コミットになる)
git cherry-pick a1b2c3d e4f5g6h

# 範囲指定(a1b2c3d を含まず、e4f5g6h までを取り込む)
git cherry-pick a1b2c3d..e4f5g6h

# コミットを分けずに、1つのコミットにまとめて取り込む
git cherry-pick -n a1b2c3d e4f5g6h
git commit -m "2つの修正をまとめて取り込み"

コンフリクトの解決

git cherry-pick a1b2c3d
# CONFLICT (content): Merge conflict in src/index.js

# ファイルを編集してコンフリクトを解決
git add src/index.js
git cherry-pick --continue

# やめたい場合
git cherry-pick --abort

取り込み元を記録する

# コミットメッセージ末尾に "(cherry picked from commit a1b2c3d)" を自動追記
git cherry-pick -x a1b2c3d

チームで複数ブランチに同じ修正を展開する場合、-x を使うと後から「このコミットはどこから来たか」を追跡しやすくなります。

git rebase との違い

コマンド対象用途
git rebaseブランチ全体のコミット群ブランチの土台を丸ごと付け替える
git cherry-pick個別の1つ・複数コミット特定の変更だけをピンポイントで別ブランチに反映する