
Git のチェリーピック
git cherry-pick
は任意の Git コミットを参照できるようにするとともに、現在作業中の HEAD にそのコミットを追加することができる強力なコマンドです。チェリーピックとは、あるブランチのコミットを別のブランチに適用する操作のことです。git cherry-pick
は変更を元に戻す際に便利です。たとえば、あるコミットを間違ったブランチに作成してしまったとします。チェリーピックを実行すれば、正しいブランチに切り替えて、コミットを本来あるべき場所に付け替えることができます。
Git チェリーピックを使うタイミング
git cherry-pick
は便利なツールですが、どんな状況でも使えるわけではありません。チェリーピックを実行するとコミットが複製されるため、チェリーピックが使えるようなシナリオでも、従来のマージを使った方が良い場合が多くあります。つまり、git cherry-pick
は一部のシナリオのみで便利なツールなのです。
チームコラボレーション。
チーム内の各メンバーがまったく同じコード、または類似するコードに取り組んでいることはよくあります。新しい製品機能にバックエンドとフロントエンドのコンポーネントがあるという場合も考えられます。2 つの製品部門で共有しているコードがあるかもしれません。また、フロントエンド開発者が利用したいと思っているデータ構造をバックエンド開発者が作成している場合もあります。フロントエンド開発者は git cherry-pick
を使って、仮想的なデータ構造が作成されたコミットを取得することができます。こうすることで、フロントエンド開発者はプロジェクトで自分たちが担当している作業をそのまま続けることができます。
バグのホットフィックス
バグが見つかった場合は、いち早くユーザーに修正を提供することが重要です。たとえば、開発者が新しい機能に取り組み始めた状況を例に取ってみます。新しい機能の開発中に既存のバグが見つかりました。開発者はこのバグを修正するために明示的なコミットを作成します。この新しいパッチコミットは、さらに多くのユーザーに影響が出る前に master
ブランチに直接チェリーピックされてバグを修正します。
変更のやり直しと失われたコミットの復元
フィーチャー
ブランチが古くなり、master
ブランチにマージされない場合があります。また、プルリクエストがマージされずに終了することもあります。Git ではこうしたコミットが失われることがなく、git log
や git reflog
などのコマンドでコミットを見つけ、チェリーピックによって活用できます。
Git チェリーピックの使い方
git cherry-pick
の使い方を説明するために、次のようなブランチ状態のリポジトリがあると仮定します:
a - b - c - d Master
\
e - f - g Feature
git cherry-pick
の使い方はいたってシンプルで、次のように実行します:
git cherry-pick commitSha
この例では、commit
Sha はコミット参照です。コミット参照は 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
と --quit
は git merge と git rebase ではより多くの機能を提供しています。
概要
チェリーピックは強力かつ便利なコマンドで、一部のシナリオでは特に大きな効果を発揮します。git merge または git rebase の代わりに間違ってチェリーピックを使わないようにしましょう。git log コマンドはチェリーピックするコミットを探す際に使用します。