Git Cherry-pick – あるコミットだけ「取る」方法

こんにちは。私はダットです。ソフトウェアエンジニアです。Javaのプログラムを作ることをしています。
プログラミングの知識や経験をみなさんにシェアするのが好きです。
このブログがあなたの役に立つとうれしいです。
フィーさんのGitシリーズの記事の続きとして、今日はGit cherry-pickについてシェアしたいと思います。
はじめに
Gitで、「feature」ブランチに大切なコミットがあり「main」ブランチにもそのコミットが必要となったケースを想定します。
でもブランチ全体をマージしたくないです。コミット1つだけがほしいです。
このとき、git cherry-pick を使います。
Git Cherry-pickとは?
git cherry-pick は、あるブランチから 1つのコミットをコピーして、別のブランチに入れるコマンド です。
- merge や rebase は、ブランチの履歴を全部持ってきます。
- cherry-pick は、コミットを1つだけ持ってきます。
簡単に言うと、「cherry-pick = 木から好きなさくらんぼを1つ取る」です。

基本の使い方
git checkout <target-branch>
git cherry-pick <commit-hash>
- target-branch = コミットを入れたいブランチ
- commit-hash = ほしいコミットの番号
コミット番号を見るときは:
git log –oneline
例
- feature/target_feature ブランチにバグ修正のコミット「a1b2c3d」があります。
- それを main ブランチに入れたいです。
やり方:
git checkout main
git cherry-pick a1b2c3d
よく使うオプション
-x オプション
- 元のコミット番号をメッセージに書きます。
- どこから来たコミットか、すぐにわかります。
git cherry-pick -x <commit-hash>
-s オプション (signoff)
- コミットメッセージに「Signed-off-by」を入れます。
- だれがこのコミットを確認したか、わかります。
git cherry-pick -s <commit-hash>
--continue
- Cherry-pick中に**コンフリクト(衝突)**があったときに使います。
- 衝突を直して、git add . をしたあとに:
git cherry-pick –continue
--quit
- Cherry-pickをやめたいときに使います。
- 今のcherry-pickを終了しますが、作業ファイルはそのままです。
git cherry-pick –quit
注意点
- コンフリクト(衝突)
マージと同じように、cherry-pickでも衝突が起こることがあります。
そのときは直して、git add . して、git cherry-pick --continue をします。
- 使いすぎないこと
Cherry-pickをたくさん使うと、Gitの歴史がわかりにくくなります。
- mergeとのちがい
- merge = 歴史ごと持ってくる。
- cherry-pick = コミットだけ持ってくる。
まとめ
git cherry-pick は便利です。コミット1つだけ必要なときに使えます。
でも、使いすぎると大変になります:
- コミットがふえます:同じ内容のコミットが、いくつもできます。番号(ハッシュ)がちがうので、まぎらわしいです。
- ログがよみにくいです:git log で同じようなコミットが出てきて、どれが本当かわかりにくいです。
- コンフリクトがふえます:何回もcherry-pickすると、マージのときに同じ所でコンフリクトになることがあります。
だから、cherry-pickはとくべつなときだけ使うほうがいいです。
今日の記事では、Git cherry-pickについて勉強しました。つぎの記事では、Git rebaseをしょうかいします。
ぜひ楽しみにしてくださいね!
参考資料:

