1. ホーム
  2. 記事一覧
  3. Gitコマンドgit cherry-pickとは?かわいいコマンドに隠された便利な機能を解説!

2024.05.06

Gitコマンドgit cherry-pickとは?かわいいコマンドに隠された便利な機能を解説!

はじめに

アプリ開発において「Git」は必須スキルとなってきます。Gitには様々なコマンドがあり、それらを使いこなすことで、開発作業の安全性の向上と効率化を図ることができます。基本コマンドは使い慣れているけれど、その他のコマンドは使ったことがない、Gitの知識を広げたいと思っている方向けに、今回は「git cherry-pick」を解説します。このコマンドの使用には注意点がいくつかありますが、使いこなせるようになると便利で強力なコマンドです。

様々なGitコマンドを習得し、Gitマスターを目指しましょう!

「git cherry-pick」について

cherry-pickは英語の慣用句で「良い所だけをつまみ食いする」という意味があります。その意味の通り、git cherry-pickは別ブランチから現在作業中のブランチへ、必要なコミットを取り込むことができます。

「必要なコミットを取り込む」とはどういうことでしょうか?git cherry-pickを実行したときの内容を図と併せて確認していきましょう。

ローカルブランチで以下のようなブランチ#1とブランチ#2を使用して開発していたとします。ここではブランチ#1で作業しているとします。

ブランチ#1での作業中に、ボタンはブランチ#2のコミットFの状態(ボタンA・Bの色が青色)にしてほしいという依頼がありました。ブランチ#2の最新コミットGは、ボタンBの色が緑色です。依頼通りにするには、ブランチ#2のコミットFを作業ブランチに取り込む必要があります。

この時にgit cherry-pickを使用することでコミットFのコミットをブランチ#1へ取り込むことができます。

ブランチの変更履歴を取り込むコマンドとしてgit mergeがありますが、git cherry-pickと何が異なるのでしょうか。git mergeはブランチのコミットの全てが取り込まれます。図のEFG全てのコミットがブランチ#1にマージされます。対してgit cherry-pickは、ブランチ#2の特定のコミットのみを取り込むことができます。今回のように、特定のコミットの変更だけを作業ブランチに取り込みたい場合に有効です。

「git cherry-pick」使用の際の注意点

コンフリクトの可能性

git cherry-pickを使ってコミットを適用する際、現在のブランチの既存の変更とコンフリクトが発生することがあります。コンフリクトが発生した場合は、手動で解決し、競合を修正する必要があります。

依存関係の確認

git cherry-pickで適用するコミットに含まれる変更(コードの追加、変更、削除)が、他のコミットで行われた変更に依存している場合、依存関係のあるコミットも取り込む必要があります。依存関係がどのコミットに存在するか探し出し解消するコストが発生します。

履歴の複雑化

git cherry-pickを実行すると、選択されたコミットの変更を取り込んだ新しいコミットが現在のブランチに作成されます。これは、同一の変更内容が複数のブランチに異なるコミットIDで存在することになり、プロジェクトの履歴を追跡することが複雑になります。

  • 履歴の複製

    git cherry-pickを使用すると、複数のブランチで同じ変更内容がコミットとして存在することになります。これは特定の変更が開発時のどの部分で、いつ導入されたか追跡するのを難しくします。同じ変更が異なるブランチで異なるコミットIDを持っている場合、履歴の追跡が複雑化する恐れがあります。

  • 追跡の困難さ

    プロジェクトでgit cherry-pickが頻繁に使用されると、元々どのブランチで行われた変更が現在のブランチにどのような経緯で適用されたのかの追跡が難しくなります。変更が何度も複製されている場合、取り込まれた機能がどのブランチから適用されたのかを特定することを一層困難にします。

git cherry-pickは強力な機能ですが、これらの注意点を考慮する必要があります。プロジェクトの履歴が複雑になり追跡しにくくなると、チーム開発でのメンバーとのコミュニケーションや将来の問題解決を困難にする恐れがあります。プロジェクトの履歴をクリーンで追跡しやすい状態に保つために、その使用は慎重に行う必要があります。

「git cherry-pick」コマンドの開発現場での活用例

  • 特定のバグ修正の適用

    作業中のブランチで発生したバグが別のブランチで修正作業がされている場合、その修正を含むコミットをcherry-pickして、作業中のブランチに迅速に適用することができます。これにより、既存の修正を再利用し、同じバグの修正に費やす時間を削減できます。

  • 特定の機能の取り込み

    新しい機能や改善が特定のブランチで実装されており、それを作業中のブランチでも利用したい場合、その機能に関連するコミットをcherry-pickして適用することができます。

  • ホットフィックスの適用

    緊急のバグ修正(ホットフィックス)がある特定のブランチで行われた後、その修正を開発中の複数のブランチに迅速に適用する必要がある場合、cherry-pickを使用すると効率的に修正を各ブランチに展開できます。

「git cherry-pick」の使い方

基本的なコマンドは以下の通りです。コミットハッシュとはコミットのハッシュ値です。

git cherry-pick [コミットハッシュ値]

コミットハッシュ値はgit logなどで調べることができます。

commitに続く数値095ed3211634d44c80bebffaba9c0622bfd8e0f5がコミットハッシュ値です。

git log

commit 095ed3211634d44c80bebffaba9c0622bfd8e0f5 (origin/feature#1)
Author: Alice <alice@sample--sample.com>
Date:  Wed May XX 00:00:00 202X 202X +0900

    headerの修正

git logについては以下の記事で詳しく解説しています。

git shortlogとは?git logとの違いを合わせて解説 | エンベーダー

特定のブランチの最新コミットのみを取り込みたい場合は、ブランチ名を指定します。

git cherry-pick [branch名]

複数のコミットをまとめて取り込みたい場合は、取り込みたいコミットの開始位置と終点位置のコミットハッシュ値を指定します。

git cherry-pick [開始位置のハッシュ値]..[終点位置のハッシュ値]

「git cherry-pick」のオプション紹介

項目説明
--edit, -eコミットメッセージを変更する
--no-commit, -nコミットをせずに変更履歴を取り込む
--signoff, -sコミットメッセージのコミットを適用したユーザーの名前とメールアドレスを編集する
--abortcherry-pickの実行処理をキャンセルする

--edit, -e

適用するコミットのコミットメッセージを編集するために使用します。git cherry-pickは元のコミットメッセージをそのまま使用しますが、このオプションを付けると編集することができます。

git cherry-pick -e [コミットハッシュ値]

git cherry-pick -eの実行結果です。

git cherry-pick -e c4f5f61909cb9c9bfaad3998f75d1a78a88ab1ab
Auto-merging vite-project/src/App.jsx
hint: Waiting for your editor to close the file...

実行後、以下のテキストエディタが自動で起動します。

1行目の部分がコミットメッセージです。メッセージの編集をして、テキストエディタの保存コマンドを使用し変更を保存します。

エディタを閉じると、git cherry-pick操作が続行され、編集したメッセージで新しいコミットが現在のブランチに作成されます。

git cherry-pick -e c4f5f61909cb9c9bfaad3998f75d1a78a88ab1ab
Auto-merging vite-project/src/App.jsx
[feature#2 85392b3] feature#1の青いボタンA.Bをfeature#2にcherry-pickしました。
 Date: Sat May x xx:xx:xx 202x +0900
 1 file changed, 2 insertions(+), 2 deletions(-)

--no-commit, -n

このオプションを使うと、選択したコミットの変更をステージングエリアに追加するだけで、自動的にコミットは行われません。この機能は、複数のコミットを一つのコミットにまとめる場合などに便利です。

git cherry-pick -n [コミットハッシュ値]

git cherry-pick -nを実行した結果です。コミットは行われず、コードのオートマージのみが実行されています。

git cherry-pick -n c4f5f61909cb9c9bfaad3998f75d1a78a88ab1ab
Auto-merging vite-project/src/App.jsx

--signoff, -s

コミットメッセージの内に、コミットを適用したユーザーの署名(名前とメールアドレス)を編集します。これは、git cherry-pickを使用してコミットした人物の特定や、変更の追跡の際に役立ちます。

git cherry-pick -s [コミットハッシュ値]

git cherry-pick -sを実行した結果ですが、今回はコンフリクトが発生しています。まず、手動でコンフリクトを解消します。

git cherry-pick -s c4f5f61909cb9c9bfaad3998f75d1a78a88ab1ab
Auto-merging vite-project/src/App.jsx
CONFLICT (content): Merge conflict in vite-project/src/App.jsx
error: could not apply c4f5f61... 青いボタンA.Bを作成しました

コンフリクトを解消後、git cherry-pick -sの処理を継続するため、git cherry-pick --continueを実行します。実行後、以下のテキストエディタが起動します。

3行目の部分が署名です。署名の編集をして、テキストエディタの保存コマンドを使用し変更を保存します。

エディタを閉じると、git cherry-pick操作が続行され、編集した署名で新しいコミットが現在のブランチに作成されます。

git cherry-pick --continue
[feature#2 8f13016] 青いボタンA.Bを作成しました
 Date: Sat May x xx:xx:xx 202x +0900
 1 file changed, 1 insertion(+), 1 deletion(-)

--abort

git cherry-pick操作を中断し、それを開始する前の状態にリポジトリを戻すために使用されます。コンフリクトが発生し、それを解決するのが困難である場合や、単純にgit cherry-pick操作をキャンセルしたい場合に、git cherry-pick --abortを使用します。

git cherry-pick --abort

git cherry-pickを実行した結果、コンフリクトが発生しました。このタイミングでgit cherry-pick --abortを実行する事で、git cherry-pickを取り消すことができます。

git cherry-pick c4f5f61909cb9c9bfaad3998f75d1a78a88ab1ab
Auto-merging vite-project/src/App.jsx
CONFLICT (content): Merge conflict in vite-project/src/App.jsx
error: could not apply c4f5f61... 青いボタンA.Bを作成しました

この記事で学んだこと

この記事を通じて、「git cherry-pick」に関連するさまざまな知識を得ることができました。簡単に振り返ってみましょう。

「git cherry-pick」について

git cherry-pickは別ブランチから現在作業中のブランチへ、必要なコミットを取り込むことができます。特定のコミットを指定する事で、作業中のブランチへ取り込むことが可能となります。

「git cherry-pick」の注意点

git cherry-pickを実行することにより、コンフリクトの発生や依存関係の解消が必要になる場合があります。また、頻繁に使用すると同じ変更履歴で異なるコミットハッシュ値が複数になるなど、プロジェクトの履歴を追うことが困難になる恐れがあります。プロジェクトでの使用は、慎重に行う必要があります。

この記事では「git cherry-pick」の基本や注意点、実際の利用法に至るまで、その活用法を詳しく解説してきました。

ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう!

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事