Gitでブランチを分けて作業する際に、別ブランチの更新内容を作業ブランチに反映したい時があると思います。
特定のブランチの更新内容を別のブランチに反映する時によく使用されるのは git merge コマンドですが、その他に、一部のコミットのみを反映したい時に活用可能な git cherry-pick コマンドが存在します。
今回の記事では、git cherry-pick コマンドを使って特定のコミットのみをブランチに反映する方法を紹介したいと思います。
git cherry-pickとは?
git cherry-pick コマンドは、特定のコミットの内容のみを別のブランチに取り込みたい際に使用するコマンドです。
全ての変更内容を反映する必要がなく、バグ修正などの一部の変更のみを適用したい場合に利用されます。
ブランチの内容を取り込む際に使用されるコマンドの1つに mergeコマンドがありますが、mergeは全ての変更内容を取り込むコマンドのため、ケースによっては意図しないコミットが含まれてしまう場合があります。
不要なマージは履歴の複雑化やコンフリクトの原因となりうるため、git cherry-pick コマンドと使い分けることでより効率的に作業することができます。
git cherry-pickの使い方
git cherry-pick コマンドは、単体のコミットを取得する場合と、複数のコミットを取得する場合の、2通りの記述方法があります。
それぞれのコマンドの書き方について見ていきましょう。
1コミットだけの場合のコマンド
1コミットだけを取り込みたい場合は、以下の構文で記述します。
git cherry-pick [コミットID]各コミットに割り当てられているハッシュ値(コミットID) を指定することで、該当のコミットを取り込むことができます。
詳しい確認方法については後ほど解説しますが、コミットIDは git log コマンドなどで確認することができます。
複数コミットの場合のコマンド
複数のコミットをまとめて取り込む場合の構文は、対象のコミットが連続する内容であるか否かで書き方が少々異なります。
前後のつながりが無い断片的なコミットをまとめて取り込む場合は、以下のようにスペースを開けて対/象のコミットをそれぞれ記述します。
git cherry-pick [コミットID 1] [コミットID 2]一方、「コミットAからコミットDまでの内容を全て取り込みたい」 といったように、特定範囲のコミットをまとめて取り込みたい場合は、以下の構文で記述します。
git cherry-pick [コミットAの1つ前のコミットのID]..[コミットDのID]範囲指定でコミットを取り込む場合は、対象範囲の始点と終点をコミットIDで指定し、間に 「..」 を記述します。
その際の注意点として、始点に指定したコミットは取り込み内容には含まれないため、取り込みたいコミットの1つ前のコミットを指定する必要があります。
1つ前のコミットを直接IDで指定する他に、以下の方法でも記述可能です。
git cherry-pick [コミットAのID]^..[コミットDのID]「^(キャレット)」 は、対象コミットの末尾に付けて記述することで、そのコミットの1つ前の親コミットを指すことができます。
こちらの方が指定範囲を感覚的に理解しやすいという方は、キャレットと組み合わせる方法で記述するといいでしょう。
cherry-pickを使う際の注意点・使用例
基本的な使い方については上記の通りですが、オプションを付けることでコマンドを実行する際の挙動を任意に変更することもできます。
また、ケースによっては処理が中断される場合などもあるので、その際の対処方法と合わせて、いくつかの使用ケースを紹介したいと思います。
コミットIDの調べ方
該当コミットの指定時に使用するコミットIDは、git log コマンドや git show コマンドで確認することができます。
commit e3e6b1eaf0ee276335799459b91e8283d2728535 (HEAD -> master, origin/master)
Author: User <user@gmail.com>
Date: Fri Nov 15 12:07:19 2019 +0900
sampleコミットcommit e3e6b1eaf0ee276335799459b91e8283d2728535 (HEAD -> master, origin/master, issue3)
Author: User <User@gmail.com>
Date: Fri Nov 15 12:07:19 2019 +0900
sampleコミット1
diff --git a/myfile.txt b/myfile.txt
index 0cb8d50..ba7fc2f 100644
--- a/myfile.txt
+++ b/myfile.txt
@@ -1,3 +1,4 @@
sampleテキスト1
-sampleテキスト2
\ No newline at end of file
+sampleテキスト3commitの欄に表示されている文字列が、各コミットに割り振られているコミットIDとなります。
使用するコマンドの引数にコミットIDを指定する必要がある場合は、ここからハッシュ値を確認するようにしましょう。
なお、コミットIDは短縮して記述することも可能です。
git logコマンドで 「–oneline」 オプションを付けて実行すると、コミットIDを短縮表示で確認することができます。
git log --oneline
e3e6b1e (HEAD -> master, origin/master) sampleコミット1
18647eb sampleコミット2
cd5deb4 sampleコミット3変更を取り込む際のメッセージを変更する
cherry-pickコマンドでは、対象とするコミットを取り込む際に新しいコミットとしてブランチに追加します。
通常、その際のコミットメッセージは取り込み元のコミットメッセージがそのまま適用されますが、メッセージを変更したい場合は 「-e」 オプションを付けることで編集が行えます。
git cherry-pick -e [コミットID]オプションを付けて実行するとエディタが開かれるので、任意の内容に書き換えて保存しましょう。
コミットせずに内容を取り込む
上述したように、cherry-pickコマンドは基本的に、対象のコミットを新しいコミットとしてブランチに追加します。
別の変更内容と一緒にコミットしたい時など、「変更内容だけを取り込んでコミットはしたくない」 といったケースで活用できるのが、「-n」 オプションです。
git cherry-pick -n [コミットID]-n オプションを使用すると、コミットはせずに変更内容を作業ブランチにコピーだけします。
この場合、変更内容を手動でコミットする必要があるので、合わせてコミットしたい変更内容とまとめてコミットするようにしておきましょう。
コンフリクトが発生した場合の対処法
mergeコマンドや rebaseコマンドなどと同様に、cherry-pickコマンドも実行した際にコンフリクトが発生する場合があります。
基本的な解消方法はその他のコマンドの時と特に変わらないので、まずは競合しているファイルを git status コマンドで確認し、該当ファイルを開いてコンフリクトマーカーが表示されている箇所を確認しましょう。
コンフリクトの解消が完了したら、git add コマンドでファイルをステージングに移し、コミットができる状態にしておきます。
cherry-pickコマンドの場合、コンフリクトが起きた段階でコマンドの実行が中断され、処理が残ったままの状態となっているため、処理の再開かキャンセルをコマンドで指示する必要があります。
処理を再開する場合は 「–continue」 オプション、コンフリクトの解消が難しいなどの理由で一旦キャンセルしたい場合は 「–abort」 オプションを付けてコマンドを実行します。
# 再開する場合
git cherry-pick --continue
# キャンセルする場合
git cherry-pick --abortまとめ
今回は、git cherry-pick コマンドの使い方について解説しました。
場合によってはコミット履歴が複雑化してしまうこともあるため、使うケースは絞り込んでおく必要がありますが、覚えておくと非常に便利な方法です。
その他のコマンドと上手く使い分けて、効率的に作業を進めていきましょう。
Gitの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Gitに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。