はじめに
アプリ開発において「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 | コミットメッセージのコミットを適用したユーザーの名前とメールアドレスを編集する |
--abort | cherry-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」の基本や注意点、実際の利用法に至るまで、その活用法を詳しく解説してきました。
ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう!
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.05.06
快適なGitライフをサポートする「git config」コマンドとは?
この記事では、Gitの設定を管理し、より快適なGit操作をこなうことができるようになる`git config`コマンドについて解説します。
- git
2024.05.06
コミットの詳細情報を表示する「git show」とは?
この記事では「git show」の解説をします。
- git
2024.05.16
「git check-ignore」コマンドとは?「.gitignore」ファイルも併せて解説
この記事では「git check-ignore」コマンドについて解説します。
- git