目次
バージョン管理システムとは、あるデータに対して変更履歴を記録していくシステムのことです。ソフトウェア開発の現場では、毎日新しいソースコードが書き加えられ、変更され、削除されています。新しい機能の追加であったり、既存の機能の強化であったり、バグの修正だったり…ソースコードが編集される理由は様々です。対応する人物が複数名であることもあります。こうして複数名でソースコードを編集していると、問題も発生しやすくなります。
ということが分からなくなってしまいがちなのです。
こうした問題を防ぐためにも利用されるのが、バージョン管理システムです。バージョン管理システムを導入すると、データにどのような変更が加わったのかを自動でシステムが判断し、いつ誰が変更したのかを記録していくことができます。ファイルの共有と同期、バックアップ、そして変更履歴記録の4つが、バージョン管理システムに備わっている主な機能です。
バージョン管理システムには「集中型」と「分散型」の2種類があります。
集中型バージョン管理システムでは、管理対象となるプロジェクトファイル群(リポジトリ)を1つのサーバーに置いておきます。
複数のプロジェクトメンバーたちは、そのサーバーからファイルのコピーを取得して編集作業を行います。作業後、変更内容はサーバーにあるファイルに反映(コミット)します。他の共同編集者たちがファイルを更新してコミットした場合は、自分の環境に変更後の内容を同期します。サーバー側ではすべての変更が記録されていて、誰が何のために編集したのかを確認したり、ある時点での状態にファイルを巻き戻したりすることも可能です。
そんな「集中型」のデメリットは、リポジトリを置いているサーバーに接続できない(オフライン)状態では変更履歴を見られず、最新版の取得や変更の反映もできないこと。作業中は常にオンライン状態でいることが必要です。
2020年現在、人気があるのはこちらの「分散型」です。集中型と異なり、リポジトリを複数持つことができるため「分散型」と呼ばれています。 分散型バージョン管理システムで現在主流なのは、リモートリポジトリをサーバー上に用意し、プロジェクトメンバーたちはそれぞれのPCにローカルリポジトリを持つという構成です。
複数のプロジェクトメンバーたちは、リモートリポジトリを元にローカルリポジトリを作成します。開発作業はローカル環境で行い、ある一定の進捗具合(機能が完成するごとや、1チケットごとなど)でリモートリポジトリにコミットします。分散型は、集中型のデメリットである「オフラインでは作業できない」という問題が発生しません。
バージョン管理システムの概要がわかったところで、今度は導入することで得られるメリットを見ていきましょう。集中型と分散型、どちらにも言えるメリットをご紹介します。
バージョン管理システムの変更履歴はとても強力です。編集者の名前や日時、変更理由はもちろん、どこがどのように変わったのかが一目瞭然の差分まで残せます。
複数人で作業していて何か不具合が起きた場合でも、変更履歴を追っていけば「いつ、どうしてこのようになったのか」が分かります。何かの誤りによるものであればその変更内容を取り消すこともできますし、変更理由を見て「そういうことだったのか」と気がつくこともあるでしょう。大勢の人がプロジェクトに関わっている場合や、長期間稼働している案件などは、特に変更履歴機能が役立つでしょう。
プログラムを変更した際、本来の変更部分以外の箇所でバグが発生したり、バージョン管理の失敗により過去の状態に戻ってしまったりすることがあります。このように、アップデートが原因で修正済みだった不具合を再発したり、前のバージョンよりもシステムの利便性が損なわれてしまうことを「デグレード」と言います。
以前のバージョンの状態に戻ってしまうという問題は、バージョン管理システムを導入することでリスクを低減できるでしょう。バージョン管理システムを導入すると、以前のバージョンではなく最新バージョンを参照することが容易になり、誤って以前のバージョンにチェックインしてしまうのを防止できます。
ファイルを更新してコミットすると、次にファイルを取得する時には通常、更新後のファイルを手に入れることになりますが、リポジトリ内には以前のバージョンのファイル情報も蓄積されて残っています。以前のバージョンのファイルが必要になった場合でも、簡単に戻すことができるのです。
手作業でバージョン管理をしていると、どうしても誤りや勘違いからバックアップを削除してしまったり、過去のバージョンのものを編集して上書きしてしまったりします。バージョン管理システムでは、万が一間違った編集や上書きをしてコミットしてしまっても、そのコミットを取り消し、元の状態に戻すことが可能です。
開発作業中は疲労から人為的ミスを起こしやすい状態になることもしばしばあります。 バージョン管理システムを導入すればこうしたミスは最小限に抑えることができるため、結果的に工数面でも有利になることでしょう。
「バージョン管理システム=Git」というような話し方をする人々がいらっしゃいますが、これは誤りです。バージョン管理システムはGit以外にも存在します。Gitは分散型バージョン管理システムのうちのひとつで、Gitがバージョン管理システムのすべてではありません。とはいえ、バージョン管理システムの中では圧倒的にGitが人気なために、このような間違った認識が広まっているのでしょう。
「Developer Survey Results 2018」によれば、「バージョン管理システムはGitを使っている」と答えたエンジニアは9割近くに上ります。Gitの他にもバージョン管理システムがあるにも関わらず、これだけ多くの人が選んでいる最大の理由は「GitHub」の存在でしょう。
GitHubはソフトウェア開発のためのプラットフォームです。GitHubにソースコードをホスティングすることで、複数のエンジニアと共同でコードレビューをしたり、プロジェクト管理を行いながらソフトウェア開発をすることができます。そしてGitHubにホスティングされたソースコードは、Gitによってバージョン管理されるのです。
さて、ここで分散型バージョン管理システムの概要を思い出してみましょう。分散型で現在主流な構成は、リモートリポジトリをサーバー上に用意し、それぞれのエンジニアはPCにローカルリポジトリを持つというものでした。プロジェクトメンバー全員でリモートリポジトリを共有するためにはサーバーが必要なのですが、GitHubはそのリモートリポジトリを預かるサービスです。
GitHubは世界中の開発者が利用しており、ユーザー数は2700万人以上。8000万件以上のプロジェクトがホスティングされている超巨大サービスで、Apple社やホワイトハウスも利用しています。
「2020 Developer Survey」では「コラボレーションツールはGitHubを使っている」と答えたエンジニアが8割以上です。GitとGitHubの圧倒的な人気の高さが伺える結果ですね。
こうしたことから、「バージョン管理システム=Git」という図式が生まれているのですが、あくまでもGitは複数あるバージョン管理システムのうちのひとつで、GitHubはそのGitを利用したソースコードのホスティングサービスです。他の選択肢もあることは覚えておくようにしましょう。
それではここで、よく使われるバージョン管理システムを紹介します。
いわずと知れたバージョン管理システム。分散型です。元はLinuxカーネルのソースコードを管理するためのものとして、Linus Benedict Torvalds氏によって開発されました。その後、世界中の様々なプロジェクトで採用され続けています。
前述の通り圧倒的な人気を誇り、多くの企業がGitによるバージョン管理を採用しています。エンジニアへの転職を目指す人たちが通うプログラミングスクールでも、カリキュラムとしてGitの扱い方が組み込まれていることが多いです。
そんな大人気のGitですが、バイナリファイルの扱いは少し苦手です。バージョン管理を主目的としているため、バイナリの変更はファイルのすべてを保存します。バイナリの変更頻度が多かったり、ひとつひとつのサイズが大きいと、プロジェクト全体でのファイル容量が膨大になり、GitHubなどのホスティングサービスで保存しきれなくなる可能性もあります。バイナリファイルを多く使用するゲーム開発などには不向きと言えるでしょう。
Subversionは集中型のバージョン管理システムです。元々はアメリカのCollabNet社が開発していましたが、現在はApacheのプロジェクトとなっています。以前は主要なバージョン管理システムに「CVS(Concurrent Versions System)」がありました。しかしCVSには問題点もあったため、それを解決するためにつくられたのがSubversionでした。
現在はGitの登場により覇権を奪われたSubversionですが、集中型のためリポジトリはひとつで、仕組みがシンプルです。Subversionの方がバージョン管理の仕組みや操作方法が分かりやすいため、学習コストが低いというメリットがあります。
Mercurialは分散型バージョン管理システムです。Mercurialは、Linuxカーネルの開発に利用されていたソースコードバージョン管理システム「BitKeeper」のフリー版の配布停止が発表されたことを受けて、Matt Mackall氏により開発されました。そう、あのGitと同様の目的で、同時期に開発されたのがこのMercurialだったのです。最終的にLinuxカーネルプロジェクトはGitを選びましたが、Mercurialは現在も他のプロジェクトで愛用されています。
日本語の資料が少ないため学習コストは高めですが、コマンドラインはGitよりもシンプルで扱いやすいというメリットがあります。
では、ソフトウェア開発にバージョン管理システムを導入すると、業務フローはどのようになるのかを見ていきましょう。
今回はGitとGitHubを使った例をご説明します。
以上が、GitとGitHubを利用した場合の業務フローの例です。
Git本来の機能には存在しない「プルリクエスト」は、GitHubにより作られた機能で、他の開発者にコードの更新を伝え、コードレビューなどを促すことができるものです。現在ではGitHub以外の多くのソースコードホスティングサービスでも利用できるようになっています。
プルリクエストにより担当者へコードレビューの実施を促し、レビューを通ったコードのみがマージできるためバグが発生しにくくなります。コードの品質が向上するため、ぜひプルリクエストを活用してみてください。
バージョン管理システム導入時には、複数の情報に当たることも大切です。ここでは、いくつか参考になるサイトを紹介します。
プロジェクト管理システムの「バックログ」が、初心者向けにつくっているGitの解説サイトです。専門用語が多く、理解が難しいバージョン管理システムのあれこれについて分かりやすく解説されています。図解が多く、身近な例を出しながら説明してくれているため、バージョン管理の初心者の方はぜひ一度読んでみてはいかがでしょうか。
こちらは@ITの記事です。バージョン管理システムの中でも分散型のみに焦点を当てて、Git、Mercurial、Bazaarの3種類を丁寧に解説しながら比較しています。
集中型との違いや、分散型特有のワークフローなども紹介されています。先ほどご紹介した「サル先生のGit入門」よりワンランク上の難しい内容となりますが、図解により分かりやすく解説されているため、知識の補強にもなります。
「みんなが使っているからって、本当にGitでいいのだろうか?」「Git以外のシステムにも触れてみたい」という方はぜひ参考になさってください。
Web制作会社の株式会社グランフェアズのブログで、Gitを利用した業務フローがコマンド付きで紹介されています。手順ごとに解説とコマンドの例が掲載されているため、自社のパターンに当てはめてイメージすることができます。
新しいシステムを導入するときには他社の事例が気になりますよね。「Gitを導入したあとは、具体的に業務はどのような流れで行えばいいのだろう?」という方は、こちらのブログをぜひご覧になってみてください。
バージョン管理システムとは、あるデータに対して変更履歴を記録していくシステムのことです。いつ、誰が、どのように、何のためにデータを変更したのかが記録を読めばはっきりするため、複数名で進めていくプロジェクトでは特に役立ちます。他にも、最新版から過去のバージョンにデータを戻すことができたり、修正したバグを手違いで復活させてしまうデグレードを防止したりできるというメリットがあります。
バージョン管理システムといえば分散型のGitが有名ですが、他にもMercurialや、集中型であるSubversionなど、Git以外のシステムもあります。学習コストはかかりますが、うまく活用することで快適な開発環境を手に入れることも可能です。ぜひ導入を検討してみてくださいね。
WEBでのお問い合わせはこちら