git cherry-pick

別のブランチのコミットを 1 つだけ選んで、いまのブランチに写し取る。

実行前の状態

feature ブランチに 2 つのコミットがあり、そのうち 1 つ目 (app.py を足した物) だけを main に持ってきたい場面です。feature 全体を取り込むと、2 つ目まで入ってしまいます。

この状態を手元で作るなら、次の順に打ちます。

ターミナル

git init -q -b main hello
cd hello
echo "# hello" > README.md
git add README.md
git commit -q -m "README を作る"
git switch -q -c feature
echo "print('hi')" > app.py
git add app.py
git commit -q -m "app.py を足す"
echo "print('bye')" > bye.py
git add bye.py
git commit -q -m "bye.py を足す"
git switch -q main

最小の例と結果

写し取りたいコミットを、番号か名前で書きます。ここでは、feature の 1 つ前のコミットを、feature~1 と書きます。

ターミナル

git cherry-pick feature~1
[main a1b2c3d] app.py を足す
 Date: Sat Oct 17 10:00:00 2026 +0900
 1 file changed, 1 insertion(+)
 create mode 100644 app.py

main に、同じ内容の新しいコミットができました。元のコミットとは別の物なので、番号が変わります。

成功の確認

main に 1 つだけ増えて、feature の 2 つ目は入っていなければ成功です。

ターミナル

git log --oneline
a1b2c3d app.py を足す
9f8e7d6 README を作る

ターミナル

ls
README.md
app.py

衝突で止まったとき

写し取る先に、同じファイルの同じ場所を変えた別のコミットがあると、cherry-pick は途中で止まります。別のブランチを作って、その様子を見ます。

ターミナル

git switch -q -c other main~1
echo "別の中身" > app.py
git add app.py
git commit -q -m "別の app.py"
git cherry-pick feature~1
Auto-merging app.py
CONFLICT (add/add): Merge conflict in app.py
error: could not apply a1b2c3d... app.py を足す
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit with "git cherry-pick --skip".
hint: To abort and get back to the state before "git cherry-pick",
hint: run "git cherry-pick --abort".
hint: Disable this message with "git config set advice.mergeConflict false"

ターミナル

git status -s
AA app.py

AA は、双方が足したファイルが、直し終わっていないという意味です。直さずにやめるなら、写し取る前の状態へ戻します。

ターミナル

git cherry-pick --abort
git status -s

何も出なければ、元の状態に戻っています。

構文と主要オプション

書き方すること
git cherry-pick <コミット>そのコミットを、いまのブランチに写し取る
git cherry-pick <古い> <新しい>2 つのあいだの複数のコミットを、順に写し取る。古い側のコミット自体は含まない
git cherry-pick -x <コミット>写し取り元の番号を、メッセージの末尾に書き足す
git cherry-pick --continue衝突を直して git add したあと、続きへ進む
git cherry-pick --abort写し取りをやめて、始める前の状態へ戻す

失敗時の戻し方

写し取ったあとで、取り消したいとき

まだ push していなければ、git reset --hard HEAD~1 で、写し取る前に戻れます。--hard は、作業中のファイルの変更まで消します。先に git status で、変更が残っていないかを確かめます。push 済みなら、git revert で打ち消すコミットを足します。

衝突で止まっているとき

やめるなら git cherry-pick --abort です。衝突を直して続けるなら、直したファイルを git add して、git cherry-pick --continue を打ちます。

同じ変更が 2 回入ってしまう

cherry-pick は、同じ内容の別のコミットを作ります。あとで feature を main に merge すると、同じ変更が二重に見えることがあります。内容が同じなら、多くは自動でうまくまとまります。衝突したときは、その場で直します。

よくある疑問

写し取り元が分からなくなりました

-x を付けて写し取ると、メッセージの末尾に (cherry picked from commit ...) と元の番号が残ります。あとで、どこから来たかをたどれます。

間違った番号を指定しました

写し取る前なら、何も起きていません。写し取ったあとなら、上の戻し方で 1 つ前へ戻します。

merge や rebase とは何が違いますか

merge と rebase は、ブランチの履歴をまとめて扱います。cherry-pick は、選んだコミットだけを写します。決まった修正を、別のブランチに持っていきたいときに向いています。

確かめた Git の版 2.53.0確認日 2026年10月20日正本は Git 公式マニュアル (英語)

Git コマンド辞典の索引へ戻る