Git チェリーピックの画像

Git のチェリーピック

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

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

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

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

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

バグのホットフィックス

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

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

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

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

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

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

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

git cherry-pick commitSha

この例では、commitSha はコミット参照です。コミット参照は git log を使って見つけることができます。また、この例ではコミット「f」を master に構築しています。まずは現在 master ブランチにいることを確認します。

git checkout master

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

git cherry-pick f

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

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

f コミットがフィーチャーブランチに取り込まれています

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 merge または git rebase の代わりに間違ってチェリーピックを使わないようにしましょう。git log コマンドはチェリーピックするコミットを探す際に使用します。