支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • いいとこ取りができて便利なGitの「

はじめに

システム開発を行う際に一度で完成形ができることは少なく、何度も修正や追加を重ねて一つずつプログラムを仕上げていくことがほとんどです。また、時には修正する前の状態に戻したいという状況も出てきます。これら新旧ファイルを人の手で全て管理しようとすると、大規模な開発であればある程に複雑な状態となり、誤認を生む可能性がある他、管理するだけの人件費も多くかかる可能性があります。そんな時に役立つのが、今回取り上げるGit等のバージョン管理システムです。

バージョン管理システムは大きく「ローカル型」「集中型」「分散型」の3つに分類され、2022年時点では「分散型」が広く普及しています。なお、Gitも分散型バージョン管理システムの一つです。今回はそんなGitとGtiを使ったWebサービスの「GitHub」の概要をおさらいしつつ、「cherry-pick」という便利な機能について紹介していきます。会社ですでにGit、GitHubが利用されているものの十分に使いこなせていない方、「cherry-pick」自体は聞いたことがあるものの利用方法が不明な方、自分が管理者でこれからバージョン管理システムの導入を検討しているという方はぜひご覧ください。

Git、GitHubについておさらい

「cherry-pick」について紹介する前に、簡単にGitやGitHubの概要を紹介しておきます。これらについて十分に頭に入っているという方は、読み飛ばしていただいて問題ありません。

Gitは当初、Linuxカーネルのソースコードを管理することを目的に開発されたシステムでした。しかし、様々な分野の開発現場で汎用的に利用できる仕組みであったため、次第にIT業界を中心に普及した経緯があります。なお、特にGtiがバージョン管理システムの始まりというわけではなく、それ以前にも同システムは存在していました。現在でもGitの他にMercurialやSubversion等が有名で、MercurialはGitと同じく分散型、Subversionは集中型のバージョン管理システムとなっています。

Gitが「分散型」に分類される理由は?

分散型の対照となるのが集中型ですが、この2つは「リポジトリ」の数に違いがあります。リポジトリとは実際にデータを設置したり、変更履歴を保存したりする作業場、 貯蔵庫を表します。集中型の場合はこのリポジトリが1つだけあり、複数の作業者がいる場合もみんなその1つのリポジトリ上に直接、変更した内容、追加したい内容を反映させます。また、リポジトリに反映させるためには必ずオンライン状態でなければなりません。

一方の分散型は、メインのリポジトリとは別に各作業者ごとにリポジトリを作成することができ、反映させたい内容を、まず個々のリポジトリのみに留めておくことが可能です。そのため、メインのリポジトリに反映させたい時のみオンラインにして、それ以外の時はオフラインであっても作業が可能という状況です。このように、リポジトリを作業者ごとに分散できるため分散型と呼ばれています。

なお、バージョン管理システムを利用するうえで、リポジトリの概念と合わせて「コミット」についても理解しておく必要があります。「コミット」という言葉はビジネス上で「責任を持って取り組む」等の意味で使われますが、バージョン管理システムではリポジトリに変更内容を反映させることを表します。また、全く同じリポジトリを複製することを「クローン」、自身のリポジトリを他のリポジトリに読み込ませることを「プッシュ」、他のリポジトリを自身のリポジトリに読み込むことを「プル」、別のリポジトリに差分のみを反映させることを「マージ」と言い、これらの用語も一緒に覚えておくと便利です。

Gitを利用するメリットは?

ファイルの変更履歴が管理できる、必要な時に指定した時点の内容に切り戻しができる、複数人で分業して同時に作業ができる、Exelや画像データも管理できるという点がGitのメリットとなります。

例えば、Excel等で作成されたスキルシートに対し、複数人がチェックを入れなければいけない状況があるとします。このシートに対して何人かが同時に作業して保存すると、全員の変更内容が保持されることはなく、最後に保存した人の内容のみが反映されることとなってしまいます。また、個人で利用しているファイルであっても、何度も変更を加えて上書き保存したデータを何回か前の状態に戻したいという場合があります。このような状況では、実際に中身を修正して戻すしかありません。そのようなことが発生しないようにと、あらかじめファイルのコピーを取って複数のファイルを違う名称で保存しておくことがありますが、名称の付け方によってはどれが最新の内容であるかがわからなくなったり、ファイル名を見たとしても、どこが修正されたファイルか一目ではわかりません。このように、複雑になってしまいがちなファイルやデータの管理を簡単にできるようにしたのがバージョン管理システムです。

バージョン管理システムを利用すると、いつ誰がどのような変更を行ったかという変更履歴が全て記録されていて、簡単に希望する時点の内容に戻すことができます。また、それぞれのリポジトリ上で作業することで、他の人の変更・追加内容を意図せず削除してしまうようなことも防げます。以上のメリットがあるため、GItはプログラマー・エンジニアの他、HTMLやCSSを利用するWebデザイナー、原稿をテキストデータとして扱うライターといった職種にも利用されています。

Gitをコマンド操作以外で利用するためには

Gitは便利なシステムですが、利用するためにコマンド操作を覚える必要があります。普段からLinux等のOSは利用していれば問題ないですが、WindowsやMacOSしか利用したことがない方にとってはややハードルが高くなることでしょう。このコマンド操作のことを「CUI(キャラクターユーザーインターフェース)」と言いますが、Gitを、WindowsやMacOSのように画面を見ながらマウス操作が可能な「GUI(グラフィカルユーザーインターフェース)」での利用を可能にしたツールがいくつかあります。GitのGUI操作を可能としたツールとしては、SourceTree、Tower、Fork等が挙げられます。これまでにGitを耳にしたことがある方は、同じくGitHubも聞いたことがあるのではないでしょうか。GitHubもGUIツールの一つとして挙げることができるものですが、さらにGitを有効に活用することを可能としています。それでは、GitHubが具体的にどのようなサービスであるかを次に紹介します。

GitHubとは?

GitHubは、Gitの機能をWeb上で利用し、GitHub上に公開しているプログラム、デザイン等のデータを世界中の人と共有できるようにしたサービスです。無料プラン、有料プランがあり、無料プランでは利用制限がかかっている機能や容量が、有料プランでは解放されるようなサービス形態になっています。なお、有料プランで利用できるようになる機能としては「保護ブランチ」「プルリクエスト」「コードオーナー」が挙げられます。「保護ブランチ」とは、すでに稼働しているプロジェクトに影響を与えず開発を進められる機能です。「プルリクエスト」は、レビューを行うことを目的として、変更等の作業を行った場合に、そのことが別の作業者に通知される機能です。「コードオーナー」は、リポジトリの責任者として、プルリクエストされた際に自動的に責任者がレビュワーとして追加されるという機能です。

はじめに世界中で共有できると紹介しましたが、企業のプロジェクト開発にGitHub利用していて、公開範囲を社内だけにしたいという状況も十分考えられます。そういった場合にパブリックリポジトリではなく、プライベートリポジトリとして公開範囲を限定することも可能です。以前は有料プランでないとできなかったものの、2022年現在は無料プランでも可能となっています。

Git/GitHubを使うための準備

Gitを利用するためには、まず利用しているコンピュータにGitをインストールする必要があるので、Gitの公式サイト「gitforwindows.org」からインストーラーをダウンロードしましょう。ダウンロードが完了したらインストーラーを利用して実際にインストールを進めることになりますが、試しに実施する場合は特に選択項目を変更することなく「Next」をクリックして進め、最後に「Install」をクリックしてください。なお、MacOSの場合は初めからGitがインストールされているので、上記の作業は不要です。

GitHubはWebサービスなのでインストール作業は不要ですが、アカウントの登録が必要です。GitHubの公式ページ(github.com)にアクセスして無料アカウント(free plan)の登録を実施してください。メールアドレスの認証をしたらアカウント登録完了となります。作成したアカウントでログインしたらすでにGitHubの利用が可能な状態なので、リポジトリの作成等を開始することとなります。

Git/GitHubの基本的な運用の流れ

まず、メインのリポジトリ(リモートリポジトリ)を作成し、その中に様々なデータを保存していきます。次に作業者ごとのローカルリポジトリを作成し、各自そのリポジトリ内で変更・追加等の作業を行います。ローカルリポジトリを作成しただけでは何もデータがない状態なので、先にコミットを行っておく必要があります。コミット後のローカルリポジトリでそれぞれ作業を行い、作業が完了したら、最後にローカルリポジトリの内容をリモートリポジトリへプッシュし、両リポジトリの差分を反映させるマージ(統合)を行うこととなります。以上が基本的な利用方法ですが、今回メインで取り上げる「cherry-pick」はこの中でどのような役割を果たし、どのようなメリットがあるのかを次の項目から具体的に紹介していきます。

「cherry-pick」を実施するメリット

マージはリモートリポジトリとローカルリポジトリの差分を反映させる方法ですが、その差分の中のさらに一部のみをリモート側に反映させたいという場合に利用できるのが「cherry-pick」です。「cherry-pick」は英語で「気に入ったものだけをつまみ食いする、品定めをする」という意味で使われるので、gitで使われる場合も同じような意味を持っていると言えます。

gitでは、各リポジトリの中でさらに履歴の流れを分岐し、「ブランチ(枝)」として異なる作業の流れを作ることが可能となっています。各ブランチは他のブランチの影響を受けないため、リポジトリ内でも複数の変更作業を同時に進めることが可能です。「cherry-pick」は、この複数のブランチ間において、あるブランチ内の一部変更箇所を別のブランチに反映(マージ)させたい場合に役立ちます。

さらに、開発における具体的な場面での使用例を紹介します。例えば、2人の開発者が同時に同じプログラムの改修を行っていたとします。全く同じ改修結果となれば何も問題ないですが、プログラムは作成者によって多少性格が表れます。部分部分によってどちらのコードを利用した方が良いという状況が発生した際に、「cherry-pick」を実行していいとこ取りをしたいという状況が考えられます。このような機能があることで、各プログラマーは相手の作業状況を気にすることなく開発を進められます。

バグに対するパッチの適用時にも「cherry-pick」は役立ちます。ある時点でバグを発見したものの、すでにそのプログラムに対する新たな改修や追加が実施されていた場合、「cherry-pick」を利用すればパッチの部分だけをつまみ取って、進行しているプログラムに適用するだけで済みます。迅速な改修が求められるシステムではその有用性が大いに発揮されることでしょう。

「cherry-pick」の使い方

今回はコマンドで「cherry-pick」を実行する方法を紹介しますが、コマンドは特に難しくありません。例えば、ブランチAに対してブランチBの一部内容を反映させたい場合は「git checkout A」でブランチAに移動した上で、「git cherry-pick [ブランチBのコミットID] 」というコマンドを実行します。コミットIDとは各作業内容に設定されているIDで、これまでのコミット履歴を確認するコマンド「git log」を実行することで確認できます。「commit」という箇所に英数字が混じった長い文字列が表示されますが、これがコミットIDとなります。

複数のコミットIDを同時に反映させたい場合は「git cherry-pick [1番目のコミットID] [2番目のコミットID]というように、間に半角スペースを入れて複数のコミットIDを併記しましょう。もし、1番目のコミットIDから5番目のIDまで全てを反映させたいという場合は、「git cherry-pick [1番目のコミットのコミットID]..[5番目のコミットのコミットID]」というコマンドを実行することで、2、3、4番目の内容も反映させることが可能となります。

良く使われるオプション

最後に、「cherry-pick」で良く利用されるオプションを5つ紹介します。1つ目は「-e、--edit」です。「cherry-pick」を実施すると元のコミットのメッセージをそのまま引継ぎますが、メッセージ内容を編集したい場合にこのオプションを付加します。2つ目は「-n、--no-commit」です。これは別のブランチの内容を持ってきたいものの、コミットまではしたくないという場合に利用するオプションです。

3つ目は「--allow-empty-message」です。なんの変更もない「空のコミット」を持ってこようとすると通常はエラーが発生します。どうしてもエラーを発生させずに空のコミットを持ってきたい場合は、このオプションを付加しましょう。空のコミットはソースごとの区切りとして利用されたり、運用ルールで決められていたりすることがあるので、その場合はオプションを利用することがあるかもしれません。4つ目は「--continue」で、複数コミットの同時「cherry-pick」を実施した際に使う可能性があります。「cherry-pick」の元のブランチと先のブランチで同じ箇所の修正が実施されている場合は「コンフリクト(競合)」を起こし、そのコミットは停止します。この場合、どちらの内容を反映させるかを決めてコンフリクトを解消させる必要があります。解消できた後に改めて対象のコミットを「cherry-pick」したい場合に利用するのがこのオプションです。

5つ目は、処理のキャンセルが可能なオプション「--abort」です。誤って「cherry-pick」した内容を切り戻したいといった場合に有効なので、使い始めはぜひあわせて覚えておきましょう。

まとめ

「cherry-pick」は、Gitを利用するうえで非常に便利なコマンドであることがわかっていただけたことでしょう。使い方もシンプルなのですぐに覚えられるかもしれませんが、似たような他のコマンドと混同しないよう注意が必要です。また、Gitの運用方法や仕組みを全体的に理解していないと「cherry-pick」を利用したとしてもかえって管理が複雑になってしまう可能性もあります。今回おさらいとしても紹介していますが、Gitがまだ十分に理解できていない場合は、今一度基礎から学んだうえで「cherry-pick」も併用していただけると幸いです。