git cherry-pick
は、任意のGitコミットを参照によってピックアップし、現在の作業HEADに追加することを可能にする強力なコマンドです。 チェリーピックとは、あるブランチからコミットを選び、それを別のブランチに適用することです。 git cherry-pick
は、変更を取り消すのに便利です。 たとえば、誤って間違ったブランチにコミットしてしまったとします。 正しいブランチに切り替え、そのコミットをあるべき場所にチェリーピックします。
When to use git cherry pick
git cherry-pick
is a useful tool but not always a best practice. チェリーピックは重複コミットを引き起こす可能性があり、チェリーピックが機能する多くのシナリオでは、代わりに従来のマージが推奨されます。 とはいえ、git cherry-pick
はいくつかのシナリオでは便利なツールです…
チームコラボレーション
しばしば、チームは個々のメンバーが同じコードで、あるいはその周辺で作業するのを見つけます。 たとえば、新しい製品機能には、バックエンドとフロントエンドのコンポーネントがあります。 2 つの製品部門間でいくつかの共有コードがある可能性があります。 バックエンドの開発者が、フロントエンドも利用する必要のあるデータ構造を作成するとします。 フロントエンドの開発者は git cherry-pick
を使用して、この仮想的なデータ構造が作成されたコミットを選択することができます。
バグ修正
バグが発見された場合、できるだけ早くエンドユーザーに修正を提供することが重要です。 シナリオの例として、開発者が新機能の開発を始めたとします。 その新機能の開発中に、既存のバグを発見しました。 開発者は、このバグにパッチを適用する明示的なコミットを作成します。 この新しいパッチコミットは、より多くのユーザーに影響が及ぶ前にバグを修正するために master
ブランチに直接チェリーピックすることができます。
変更の取り消しと失ったコミットの復元
時には、feature
ブランチは古くなって master
にマージされないことがあります。 時には、プルリクエストがマージされずにクローズされることもあります。 Git はこれらのコミットを決して失うことはありません。git log
や git reflog
といったコマンドを使えば、それらのコミットを見つけて生き返らせることができるのです。
How to use git cherry pick
git cherry-pick
の使い方を説明するために、次のようなブランチ状態のリポジトリがあるとします:
a - b - c - d Master
\
e - f - g Feature
git cherry-pick
使い方は簡単で次のように実行できます:
git cherry-pick commitSha
この例では commit
Sha がコミットの参照になっています。 コミットリファレンスは git log
で見つけることができます。 この例では、master
のコミット `f` を使用する場合を想定しています。 まず、master
ブランチで作業していることを確認します。
git checkout master
そして、次のコマンドでチェリーピックを実行します。
git cherry-pick f
実行後の Git の履歴は、このようになります。
a - b - c - d - f Master
\
e - f - g Feature
The f commit has been successfully pick into the master branch
git cherry pick の例
git cherry pick
また、いくつかの実行オプションが渡されることもあります。
-edit
-edit
オプションを渡すと、チェリーピック処理を適用する前にコミットメッセージを求めるプロンプトが表示されます
--no-commit
--no-commit
オプションは、チェリーピックを実行する代わりに、新しいコミットが行われず、ターゲットコミットの内容を現在のブランチの作業ディレクトリに移動させます。
--signoff
--signoff
オプションはチェリーピックのコミットメッセージの最後に ‘signoff’ 署名行を追加します
これらの役に立つオプションに加えて、git cherry-pick
はさまざまなマージ戦略オプションも受け付けます。 これらのオプションについて詳しくは、git merge strategies ドキュメントを参照してください。
さらに、git cherry-pick はマージの競合を解決するためのオプション入力も受け付けます。 --abort --continue
および --quit
このオプションについては、git merge および git rebase に関してより詳しく説明します。
まとめ
チェリーピックは強力で便利なコマンドで、いくつかのシナリオでは非常に便利です。 チェリーピッキングは、git merge や git rebase の代わりに誤用してはいけません。 チェリーピックを行うコミットを見つけるには、git log コマンドが必要です。