職場で「プッシュしたから、チェリーピックしておいて」と言われた。
…ところで、チェリーピックってなに?
このような方に向けて書きました。
Gitで開発をしていると、あるコミットだけを別のブランチに取り込みたい場合があります。
そんなときに便利なのがチェリーピックです。
この機能を使えば、過去の変更を他のブランチへ簡単に反映できます。
最速で理解するチェリーピック
まずはチェリーピックがどんなものかを解説します。
先にコマンドだけ知りたい方は、以下のリンクから説明に飛べます。
» リンク:git cherry-pick コマンドの使い方
チェリーピックとは?
文章だとなかなか伝わらないので、ここからは図を使って説明します。
例えば、あなたが青色の場所で作業しているとします。
同僚の佐藤さんは、この時点で2回コミットをしていました。
実はコミットAには、チームメンバー全員に適用してほしい変数を実装していました。
佐藤さんから「コミットAだけを取り込んでくれない?」と Slack でメッセージが入ります。
そんな時には、作業中のブランチから git cherry-pick コマンドを実行します。すると、コミットAの変更分だけが作業中のブランチに反映されるというわけです。
このように、コミット単位で変更内容を反映できるのがチェリーピックです。
マージとの違い
「マージ」も、他のブランチの変更内容を取り込む点では同じですが、大きな違いがあります。
先ほどの例でマージをしてしまうと、コミットAとコミットBの両方を取り込むことになってしまいます。
コミットBを取り込みたくない場合には、マージでは不都合です。
このようにマージでは余計な変更まで取り込んでしまうので、欲しいコミットだけをピンポイントで取得したい場合にはチェリーピックを使います。
git cherry-pickコマンドの使い方
チェリーピックは、他のコミットを作業中のブランチに適用ものです。
基本的な使い方
チェリーピックは次の流れで行います。
- 取り込みたいコミットのIDを調べる
- cherry-pickコマンドを実行
- (あれば)コンフリクト解消
順番に説明します。
取り込みたいコミットのIDを調べる
まず、適用したいコミットがあるブランチに移動します。
git checkout target-branch
過去のコミットを確認するため、git log コマンドを実行します。
git log
すると、過去に target-branch でされたコミットが表示されます。
commit 1a2b3c4d5e6f7g8h9i0jklmnopqrstuv
Author: John Doe <john.doe@example.com>
Date: Mon Sep 25 10:15:00 2024 +0900
Fix typo in README.md
commit 9z8y7x6w5v4u3t2s1r0qponmlkjihgfedcba
Author: Jane Smith <jane.smith@example.com>
Date: Sun Sep 24 15:30:00 2024 +0900
Add new feature to the user profile page
commit abcdef1234567890ghijklmnopqrstuv
Author: Alice Brown <alice.brown@example.com>
Date: Fri Sep 22 09:45:00 2024 +0900
Refactor login system for better performance
commit 0123456789abcdef9876543210fedcba
Author: Bob White <bob.white@example.com>
Date: Thu Sep 21 14:10:00 2024 +0900
Initial commit
今回はこのうち、2つ前のコミット(ハイライトした部分)を取り込みたいとします。
commitの後にあるハッシュ値を控えておきましょう。
上記は自分で調べる方法ですが、Slackなどで直接コミットIDを教えてもらう手もあります。
cherry-pickコマンドを実行
その後、この変更を適用したいブランチに戻ります。(今回はdevelopに先ほどのコミットを適用したいとしましょう)
git checkout develop
最後に、先ほど控えたコミット ID を git cherry-pick コマンドの引数に渡して実行します。
git cherry-pick 9z8y7x6w5v4u3t2s1r0qponmlkjihgfedcba
これで、指定したコミットが現在のブランチに適用されます。
git cherry-pick コマンドのオプション
git cherry-pick コマンドで使えるコマンドオプションを紹介します。
オプション | 説明 |
---|---|
-e | コミットメッセージを編集 |
-x | 追跡用に元のコミットハッシュを含める |
-n | コミットせずステージング状態にする |
--allow-empty | 空コミットを許可 |
コンフリクトが起きた場合
コンフリクトが発生したら、通常のマージと同様にコンフリクトを解決してから以下のコマンドを実行します。
git add <修正ファイル>
git cherry-pick --continue
チェリーピックを取り消したい場合
次のコマンドでチェリーピックを取り消せます。
git cherry-pick --abort
ただし取り消せるのは、cherry-pick コマンドの実行からプッシュまでの間です。
つまりこのコマンドが有効なのはローカルリポジトリでの話であって、プッシュ後の取り消しはgit revert
やgit reset
が必要になります。
もっとチェリーピックコマンドを使いこなす
複数のコミットをチェリーピックする方法
スペース区切りでコミットIDを列挙することで、複数コミットをチェリーピックできます。
git cherry-pick a1b2c3d4 e5f6g7h8
三つ以上のコミットをチェリーピックする場合も同様で、全てのコミットIDをスペースで繋ぎます。
git cherry-pick a1b2c3d4 e5f6g7h8 f5g6h7i8
範囲指定してチェリーピックする方法
連続するコミットを範囲指定してチェリーピックする場合は、最初と最後のコミットIDを^..
で繋ぎます。
git cherry-pick <最初のコミットID>^..<最後のコミットID>
これで、指定した範囲内のすべてのコミットが現在のブランチに適用されます。
まとめ
チェリーピックは、コミット単位で別のブランチに反映するためのコマンドでした。
本ブログでは他にもGitに関する記事を取り扱っていますので、ぜひ別記事もご覧になってください。
コメント