git cherry-pickは
特定のコミットを現在のbranchに取り込むコマンドです。名前から簡単に分かるように、色んなコミットの中で特定のコミット(チェリー)だけを取り出すと理解すれば簡単です。
使い方
全てのコミットはそれぞれ固有のIDであるハッシュ値が存在し、これを利用して特定のコミットを取得することができます。
基本的なコマンドは次のようになります。
git cherry-pick <commit-hash> <commit-hash>.
mergeをせずにそのコミット履歴をmainに取得してみます。
現在main branchのログは次のような感じです。
commitされた変更内容をmain branchにインポートして、HEADがcherry-pickで
インポートしたcommitを指すようになりました。
複数のコミットをインポートすることもできますし、範囲を指定することもできます。
# 複数のコミットをインポートする git cherry-pick <commit-hash1> <commit-hash2> # 範囲を指定してインポートする git cherry-pick <start-commit>..<end-commit>.
主なオプション
-edit
または-e
: コミットメッセージを編集することができます。-no-commit
または-n
: 変更をステージングエリアに追加してコミットしません。-signoff
または-s
: コミットメッセージに署名を追加します。-x
: コミットメッセージに元のコミットハッシュを追加します。
いつ使うべきか?
-
バグ修正の適用
- 特定のブランチで発見されたバグを他のブランチにも早く適用する必要がある時。
- 例えばプロダクションブランチの緊急のバグ修正を開発ブランチにも適用する。
-
特定機能の移行
- あるブランチで開発された機能の一部だけを別のブランチに移す必要がある場合。
- 例:実験的なブランチで成功した機能をメイン開発ラインに統合する。
-
リリース管理
- 特定のリリースに含まれるべき変更点だけを選択的にインポートする時
- 例:次のバージョンリリースに含まれる機能だけを選択的に適用する場合
競合注意
cherry pickもとにかくコミット履歴をインポートしてまとめるので、いつでもクラッシュが発生する可能性があります。
コンフリクトが発生した場合、コンフリクトを解決して下記のコマンドで継続することができます。
git cherry-pick --continue
追加オプション:
- Cherry-pick abort: コンフリクトの解決が複雑な場合やcherry-pickをキャンセルしたい場合は
git cherry-pick --abort
このコマンドはcherry-pickを開始する前の状態に戻します。
- コンフリクトを残して次のコミットに進む: 複数のコミットを cherry-pick している場合、現在のコンフリクトを残して次のコミットに進むことができます。
git cherry-pick --skip
- 3-wayマージを使う: cherry-pick時に
-m
オプションを使うと3-wayマージを実行します。これにより、コンフリクトの解決がより簡単になることがあります。
git cherry-pick -m 1 <commit> <commit>.