Git cherry-pick について

🌐

この記事は DeepL によって翻訳されました。誤訳があれば教えてください!

git cherry-pickは特定のコミットを現在のbranchに取り込むコマンドです。名前から簡単に分かるように、色んなコミットの中で特定のコミット(チェリー)だけを取り出すと理解すれば簡単です。

Image.png

使い方

全てのコミットはそれぞれ固有のIDであるハッシュ値が存在し、これを利用して特定のコミットを取得することができます。

Image.png

基本的なコマンドは次のようになります。

git cherry-pick <commit-hash> <commit-hash>.

mergeをせずにそのコミット履歴をmainに取得してみます。

現在main branchのログは次のような感じです。

Image.png

Image.png

Image.png

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>.