\ お問い合わせはこちら! /

【すぐ分かる】チェリーピック(git cherry-pick)の使い方

職場で「プッシュしたから、チェリーピックしておいて」と言われた。
…ところで、チェリーピックってなに?

このような方に向けて書きました。

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の後にあるハッシュ値を控えておきましょう。

karo

上記は自分で調べる方法ですが、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 cherry-pick コマンドのオプション

コンフリクトが起きた場合

コンフリクトが発生したら、通常のマージと同様にコンフリクトを解決してから以下のコマンドを実行します。

git add <修正ファイル>
git cherry-pick --continue

チェリーピックを取り消したい場合

次のコマンドでチェリーピックを取り消せます。

git cherry-pick --abort

ただし取り消せるのは、cherry-pick コマンドの実行からプッシュまでの間です。

つまりこのコマンドが有効なのはローカルリポジトリでの話であって、プッシュ後の取り消しはgit revertgit resetが必要になります。

もっとチェリーピックコマンドを使いこなす

複数のコミットをチェリーピックする方法

スペース区切りでコミットIDを列挙することで、複数コミットをチェリーピックできます。

git cherry-pick a1b2c3d4 e5f6g7h8

三つ以上のコミットをチェリーピックする場合も同様で、全てのコミットIDをスペースで繋ぎます。

git cherry-pick a1b2c3d4 e5f6g7h8 f5g6h7i8

範囲指定してチェリーピックする方法

連続するコミットを範囲指定してチェリーピックする場合は、最初と最後のコミットIDを^..で繋ぎます。

git cherry-pick <最初のコミットID>^..<最後のコミットID>

これで、指定した範囲内のすべてのコミットが現在のブランチに適用されます。

まとめ

チェリーピックは、コミット単位で別のブランチに反映するためのコマンドでした。

本ブログでは他にもGitに関する記事を取り扱っていますので、ぜひ別記事もご覧になってください。

» 参考:CFXLOG – Git に関する記事

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Pythonが得意。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)