git cherry-pickコマンド:複数コミット、競合、キャンセル、オプション
この記事では git cherry-pick
コマンドについて説明します。基本的な使い方、複数のコミットを扱う方法、競合の管理、順番、さまざまなオプションについて説明します。
1. git チェリーピックとは?
Git におけるチェリーピックとは、あるブランチのコミットをコピーして別のブランチに挿入することです。
使い方次第では非常に強力な機能ですが、履歴を散らかしてしまうこともあります。これを行うには git cherry-pick
コマンドを使用します。
特に、git cherry-pick
コマンドは緊急のバグ修正やブランチ間での部分的なコードの同期などに使用します。
それ以外の場合は、共同作業であっても git merge や git rebase のような比較的安全な方法を使うのがよい方法です。
は良いプロセスです。
そこで、まずは git cherry-pick
コマンドの使い方を理解して、必要なときにすぐに使えるようにしましょう。
2. チェリーピックの基本的な使い方
git cherry-pick
コマンドの使い方はとてもシンプルです。まずコミットを追加したいブランチに移動し、別のブランチからプルしたいコミット ID を次のように入力します。
$ git cherry-pick [commit-id]
そのコミットと同じ変更をしたコミットは、現在のブランチの新しいコミットとして登録されます。
たとえば、現在次のようなコミット履歴があるとします。
A - B - C - D main
\ E - F - G feature-a
main
ブランチでバグが見つかり、feature-a
ブランチで作業していた開発者が feature-a
ブランチにバグを修正するコミット G
を行ったとします。
この時点で、コミット G を main
ブランチに取り込んでサービスをすばやく復旧させる必要があります。
以下のように、git cherry-pick
コマンドを使用してこのコミットを追加します。
$ git cherry-pick [commit-id-G]
その後、コミット履歴は次のようになります。
A - B - C - D - H main
\ E - F - G feature-a
これは、コミット G
のすべての変更がコミット H
に追加されたことを意味します。
3. 複数のコミットをチェリーピックする
複数のコミットを一度にインポートするには、2つの方法があります。
3.1. チェリーピック
最初の方法は、コミットをひとつずつ入力する方法です。以下のように、目的のコミットIDを一つずつ入力します。
$ git cherry-pick [commit-id-1] [commit-id-2] [commit-id-3]
これは、 git add コマンド を使って複数のファイルやフォルダを追加したときと同じパターンです。この場合は、新しいコミットとして前から追加されます。
3,2. 範囲指定によるインポート
もうひとつの方法は、インポートするコミットの範囲を指定する方法です。..
と ...
のどちらを使ってもよく、チェリーピッキングではどちらも同じように扱われます。
この場合、[older-commit-id]
は除外され、後のコミットからコピーされます。
$ git cherry-pick [older-commit-id]..[new-commit-id]
セクション2で見た feature-a
ブランチから F
と G
のコミットをプルしたい場合は、次のように入力します。
$ git cherry-pick [commit-id-E]..[commit-id-G]
もし、[older-commit-id]
のコミットも含めたい場合は、^...
という記号を使うこともできる。
$ git cherry-pick [commit-id-F]^..[commit-id-G]
4. チェリーピックのコンフリクトの解決やキャンセル
git cherry-pick
を実行すると新しい変更をコミットすることになり、もちろんコンフリクトが発生する可能性があります。
この場合は、マージやリベースと同じように、チェリーピックを続行する前にコンフリクトを手動で解決しなければなりません。
このプロセスはリベースと同じパターンに従います。コンフリクトを手動で解決した後、チェリーピックを完了またはキャンセルするには、コマンドで以下の2つのオプションを使用できます。
終了するには、コマンド
$ git cherry-pick --continue
中止するには、以下のコマンドを使用する。
$ git cherry-pick --abort
5. よく使うオプション
以下のコマンドは git cherry-pick
コマンドと組み合わせてよく使います。これらをよく理解して、必要に応じてコマンドと組み合わせて使ってください。
5.1. -n, --no-commit オプションでコミットせずに待つ
デフォルトでは、git cherry-pick
コマンドは新しいコミットを作成することを想定しています。
しかし、時には特定のコミットを取得したいが、別の変更を追加した後でそれをコミットしたいということもあるでしょう。
そのためには、cherry-pick
で生成したコミットと別のコミットが必要になります。
このような場合に -n'
または --no-commit
オプションが役に立ちます。これは cherry-pick
コマンドによって取り込まれた変更をコミットせず、ステージング状態にしておくためです。
これにより、個別にコミットすることなく必要な変更を追加し、一度にコミットすることができます。
5.2. -e および --edit オプションによるコミットメッセージの変更
通常 git cherry-pick
コマンドは、次のようなコミットメッセージを自動的に生成します。
cherry-pick [commit-id] [commit-message-of-picked-commit]
このコミットメッセージを修正したり、さらに情報を追加したりするためにエディタを開きたい場合は、 -e
または --edit
オプションを使用できます。
5.3. インポートしたコミットの作者を表示する --signoff オプション
オープンソースプロジェクトで作業している、あるいはオープンソースプロジェクトで共同作業をしていてチェリーピック機能を使用している場合、インポートしたコミットの author
を表示する規約があることが多いでしょう。
このような場合に --signoff
オプションを使用すると、前のコミットの author
をコミットメッセージに自動的に追加することができます。
例えば、以前のコミットメッセージが以下のようなものだったとします。
Implement new feature ABC
--signoff
オプションでチェリーピックされた新しいコミットに対するメッセージは、以下のように自動的に記述される。
Implement new feature ABC
Signed-off-by: Your Name [your.email@example.com]
5.4. マージ戦略を指定する --strategy オプションの使用
マージ中にコンフリクトが発生する可能性があるため、cherry-pick
コマンドでは手動でマージ戦略を指定することもできます。
現在のデフォルトの ort
戦略を含め、最も一般的なマージ戦略は git merge post の最後のセクションにまとめられています。
コマンドは次のとおりです。
$ git cherry-pick --strategy [merge-strategy]
6. まとめ
git cherry-pick
コマンドは、プロジェクトで密な共同作業が必要なときに指先で使える強力なコマンドです。
いざというときに使えるように、しっかり覚えておいてくださいね。
