Git チェリーピックの画像

Git のチェリーピック

git cherry-pick は任意の Git コミットを参照できるようにするとともに、現在作業中の HEAD にそのコミットを追加できる強力なコマンドです。チェリー ピックとは、あるブランチのコミットを別のブランチに適用する操作のことです。git cherry-pick は変更を元に戻す際に便利です。たとえば、あるコミットを間違ったブランチに作成してしまったとします。チェリー ピックを実行すれば、正しいブランチに切り替えて、コミットを本来あるべき場所に付け替えられます。

Git チェリーピックを使うタイミング

git Cherry-pick は便利なツールですが、どんな状況でも使えるわけではありません。チェリー ピックを実行するとコミットが複製されるため、チェリー ピックが使えるようなシナリオでも、従来のマージを使った方が良い場合が多くあります。つまり、git cherry-pick は一部のシナリオのみで便利なツールなのです。

チームコラボレーション。

チーム内の各メンバーがまったく同じコード、または類似するコードに取り組んでいることはよくあります。新しい製品機能にバックエンドとフロントエンドのコンポーネントがあるという場合も考えられます。2 つの製品部門で共有しているコードがあるかもしれません。また、フロントエンド開発者が利用したいと思っているデータ構造をバックエンド開発者が作成している場合もあります。フロントエンド開発者は git cherry-pick を使って、仮想的なデータ構造が作成されたコミットを取得できます。こうすることで、フロントエンド開発者はプロジェクトで自分たちが担当している作業をそのまま続けられます。

バグのホットフィックス

バグが見つかった場合は、いち早くユーザーに修正を提供することが重要です。たとえば、開発者が新しい機能に取り組み始めた状況を例に取ってみます。新しい機能の開発中に既存のバグが見つかりました。開発者は、このバグをパッチする明示的なコミットを作成します。この新しいパッチ コミットは、さらに多くのユーザーに影響が出る前に main ブランチに直接チェリー ピックされてバグを修正します。

変更のやり直しと失われたコミットの復元

feature ブランチが古くなり、main ブランチにマージされない場合があります。また、プル リクエストがマージされずに終了することもあります。Git ではこうしたコミットが失われることがなく、git loggit reflog などのコマンドでコミットを見つけ、チェリー ピックして活用できます。

Git チェリーピックの使い方

git cherry-pick の使い方を説明するために、次のようなブランチ状態のリポジトリがあると仮定します:

    a - b - c - d   Main
         \
           e - f - g Feature

git cherry-pick の使い方はいたってシンプルで、次のように実行します:

git cherry-pick commitSha

このサンプルでは、commitSha はコミット参照です。git log を使えば見つかります。また、サンプルではコミット「f」を main に構築しています。まずは現在 main ブランチにいることを確認します。

git checkout main

次に、以下のコマンドでチェリーピックを実行します:

git cherry-pick f

実行が完了すると、Git 履歴は次のようになります:

    a - b - c - d - f   Main
         \
           e - f - g Feature

f コミットが main ブランチに取り込まれています

Git チェリーピックの例

Git チェリー ピックにはいくつかの実行オプションを渡せます。

-edit

-edit オプションを渡すと、チェリー ピック操作前に git からコミット メッセージを求められます。

--no-commit

--no-commit オプションはチェリー ピックを実行しますが、新しいコミットを作成するのではなく、対象コミットのコンテンツを現在のブランチの作業ディレクトリに移動します。

--signoff

--signoff オプションは、オプションはチェリー ピック コミット メッセージの末尾に署名行を追加します。

git cherry-pick には他にも役に立つオプションとして、さまざまなマージ用オプションが用意されています。これらのオプションについては、git merge 戦略のドキュメントを参照してください。

また、git cherry-pick はマージの競合を解決するオプション入力も受け付けます。たとえば、--abort --continue--quitgit mergegit rebase ではより多くの機能を提供しています。

概要

チェリー ピッキングは強力で便利なコマンドで、一部のシナリオでは特に大きな効果を発揮します。git mergegit rebase の代わりに間違ってチェリー ピックを使わないようにしましょう。git log コマンドはチェリー ピックするコミットを探す際に使用します。