DevOpsのアプリ開発にも欠かせない「Git」を活用したソースコードのバージョン管理
はじめに
DevOpsに限らず、アプリケーション開発において外せないツールの1つにバージョン管理システムがあります。開発を進めていく中で手戻りなく順番にリリースできれば理想的ですが、システムやアプリケーションへのニーズは多様で変化が激しく、リリースまでに求められる時間は非常に短くなっています。そのような中でのアプリケーション開発では急に方針転換を求められたり、不具合や緊急対応で着手中の機能開発よりも優先して取り組む必要が出てきたりと、臨機応変に対応する必要に迫られることがあります。
バージョン管理の仕組みを導入することで、任意のタイミングから複数人で並行して機能開発を進められたり、挑戦的な機能開発を進めていたが仕切り直したいときには非常に効果的です。現在よく使用されているバージョン管理システムに「Git」があります。Gitは多機能で便利な反面、学習のコストやハードルは低くありません。そこで今回は、Gitによるバージョン管理の基本操作について学びましょう。
Gitとは
Gitとは、主にソースコードの変更履歴を管理する分散バージョン管理システムです。Linuxカーネルのソースコード管理を目的に、リーナス・トーバルズ(Linuxの生みの親)によって開発されました。
バージョン管理システム
バージョン管理とは、ファイルを「誰が」「いつ」「何を変更したのか」のような情報を記録することで変更履歴を残すことです。変更履歴を辿ることで、任意のタイミングの状態がどのようになっていたかを知ることができます。手書きのメモなどの履歴をたどって復元することは想像しただけで大変な作業ですが、バージョン管理をシステム化することで変更履歴の蓄積や任意のタイミングへの復元が高速かつ簡単になります。
バージョン管理システムには、ある時点の状態Aとある時点の状態Bの間でどのような変更が加えられたかの差分(Diff)を取得できます。このようなバージョン管理に必要な機能をより便利に活用できるようにして提供しているツールがGitをはじめとするバージョン管理システムです。
集中型と分散型
バージョン管理システムでよく聞く言葉にとして「集中型」と「分散型」があります。最近では分散型のGitが主流ですが、集中型についても知ることで、より分散型への理解が深まります。
集中型
集中型は1つのバージョン管理システムのサーバーを用意し、そのサーバーと対話することでバージョン管理する方法です。分散型と表現を合わせるのであればリモートリポジトリのみが存在しているようなイメージです。基本的にはネットワークを介した通信となるため、ネットワークが使用できない場合にはバージョン管理もできなくなるというデメリットがあります。
集中型のバージョン管理システムとして挙げられるツールの代表格としてSubversin(SVN)があります。Gitの登場前まではバージョン管理システムの主流としてよく使用されていましたが、最近ではGitを代表する分散型のアーキテクチャへのシフトが進んでいます。また、GitHubのSubversion向けサービスの提供終了が発表されたことで、より集中型のバージョン管理システム離れが進んでいくと考えられます。
分散型
分散型は、集中型のアーキテクチャにローカルリポジトリが増えたようなものになります。ネットワークを介して開発メンバーと変更を共有するためのリポジトリをリモートリポジトリと呼び、開発メンバーごとのローカルマシン上に構築されるのはローカルリポジトリです。分散型でもリモートリポジトリを経由して開発メンバーと変更を共有するため、ネットワークに依存することは変わりません。ただし、ローカルリポジトリがあることで、リモートリポジトリに接続できない状態でもローカルリポジトリとやりとりしてバージョン管理ができます。
Gitを使ったチーム開発
ここまで、バージョン管理システムやGitについて基本的な知識を解説しました。以降では、実際にGitを活用してチーム開発を行っていくために必要なことについて学んでいきましょう。
チーム開発をするためには、ローカルマシン上にGitのCLIツールをインストールするだけでは不十分です。GitのCLIツールを活用するとローカルリポジトリのみでバージョン管理できますが、開発メンバーで変更を共有するためにはリモートリポジトリが足りません。
リモートリポジトリを手に入れるためには、公開されたバージョン管理サーバーが必要です。公開サーバーを用意するために独自でサーバーを構築しても良いですが、初期開発コストや運用コストなどがかかるため「GitHub」を使用します。
GitHubとは
GitHubは、Gitをバージョン管理システムとして使用したソースコードをホスティングするサービスで、人気の高いサービスの1つです。
GitHubを使用することで、リモートリポジトリの管理だけでなく、リモートリポジトリに変更を反映させる際にプルリクエスト機能を使用して変更内容をレビューするような仕組みが用意されています。これらの機能を活用することで、常にクリーンなコードを維持できるようになります。
・プルリクエストとは
プルリクエストはGitHubの中でも主要な機能の1つです。GitHubを使用してチームで開発している人は必ず1度は使ったことがあるのではないでしょうか。プルリクエストを活用することでレビューを効率的に進められるようになります。
・ソースコード単位でのコメント
プルリクエストでは、ソースコード単位でSNSのコメント機能のようにやりとりができます。Slackなどにコピペしてやりとりするよりも、GitHubのコメント機能を活用した方がソースコードに関するやりとりの内容が分散せずに行うことができます。
・承認
プルリクエストでは設定からApproveされていないとマージできないように設定できます。この機能を活用することで、レビューされていない変更を勝手にマージさせないようにできます。これにより必ず誰かのレビューを通したことを担保できるようになります。
・変更の提案
プルリクエストでは、コメントでソースコードの指摘をこと細かくして相手に修正してもらう方法だけでなく、レビューする側が最終的なソースコードを記述してから相手に変更提案ができる機能です。この機能を活用することで思ったように修正されずに何度もやりとりを繰り返すなどの手間が減らせるようになります。
ここで挙げた機能以外にもGitHubには様々な便利機能がありますので、興味が出てきた方は実際に使ってみてはいかがでしょうか。
Gitを使用するためのサービス
GitはCLIツールですが、コマンドを入力して何かを実行することがあまり得意ではない方もいるのではないでしょうか。実は、Gitをグラフィカルなインターフェース(GUI)として使用できるサードパーティ製のツールがあります。
CLIとGUIのどちらを使うべきか
「CLIとGUIのどちらを使うべきか」はよくある話です。1つの例として、普段はGUIをメインで使いつつ、GUIではできないような高度な操作が必要な場合、必要に応じてCLIから実行するような方法があります。
人によってはCLI操作に長けていてGUIを操作するよりも早い方もいますが、ほとんどの方はコマンドを入力するよりもボタンを押した方が直感的で早く操作できるのではないでしょうか。
CLIの黒い画面にキーボードだけでカタカタと入力していく姿はかっこよく見えますし、最近ではドラマや映画のワンシーンでエンジニアの演出として定番シーンの1つにもなっています。
主なソフトウェア
下記のGitのドキュメントサイトで、OSごとにサポートされているサードパーティ製のツールがまとめて紹介されています。気になる方はそちらを参照してください。
【GUI Clients】
https://git-scm.com/downloads/guis/
ここでは、その中からよく知られているツールを2つピックアップして簡単に紹介します。
・GitHub Desktop
GitHub社が提供するデスクトップツールです。GitHubが公式で提供していることもあり、GitHubとの連携の相性は非常に良いです。基本的にWebサイトで操作するようなサービスのためデスクトップ版で行えることには限りがあるとも言えますが、開発サイクルを回していくために必要最小限の機能はサポートされています。
【GitHub Desktop】
https://desktop.github.com/
・Sourcetree
アトラシアン(Atlassian)社が提供するデスクトップツールです。GitHub Desktopに比べると機能は豊富な印象がありますが、とは言っても「大は小を兼ねる」にはならないので、実際に使ってみて使い勝手が良さそうな方を選択しましょう。
【Sourcetree】
https://www.sourcetreeapp.com/
Gitの基本操作
ここからは、Gitをまだ触ったことがない方向けに、基本的なコマンド操作を紹介します。今回はGitコマンドの細かいインストール方法については省略しています。また、実行するコマンドに関してはmacOSを例にしているので、必要に応じて読み替えてください。
Gitを使った開発の始め方
Gitを使った開発の始め方には、大きく下記の2パターンがあります。
- ①GitHubなどのリモートリポジトリからプロジェクトをクローンする方法
- ②ローカルマシン上でGitプロジェクトを作成する方法
①GitHubのリモートリポジトリからローカルリポジトリにクローン
既存プロジェクトに途中参加する際などによくある方法です。この場合は、責任者や他の開発メンバーからGitHubなどのリポジトリ情報を教えてもらいます。教えてもらったリポジトリのURLを使用して、次のコマンドを実行します。
git clone <リポジトリURL> cd <リポジトリ名>
コマンドの実行が終了すると、リポジトリ名で新しくディレクトリが作成されます。ディレクトリが作成されたことを確認できたら、cdコマンドを使ってプロジェクト内に移動しておきます。これで開発の準備は終了です。
プロジェクトのディレクトリ内にバージョン管理対象の.git
ファイルが既に含まれているため、自動的にディディレクトリ内のバージョン管理が有効になっています。
②ローカルマシン上でGitプロジェクトを作成する
この方法は1から開発を始める際に実行します。まず任意のディレクトリを用意してから初期化コマンドを実行します。
mkdir git-sandbox cd git-sandbox git init
最後のコマンドの実行が終わるとバージョン管理が有効になります。これ以降の変更が記録されます。
次に、リモートリポジトリを追加します。リモートリポジトリはGitHubなどで事前に用意できているものとします。
git remote add origin <リポジトリURL>
リモートリポジトリが正しく追加できたかを確認するためには、次のコマンドを実行してください。
git remote -vv
正しく追加されている場合には、リモートリポジトリの内容が表示されます。
変更したコードをリモートリポジトリへ反映
実際にソースコードを追加してから、リモートリポジトリへ変更を反映してみましょう。まずはソースコードに見立てたテキストファイルを用意します。</p>
echo “console.log(`Hello, World!!`)“ > hello.txt
変更した内容をコミットする必要はありますが、Gitの仕組みが理解できるまでは少し難しく感じます。Gitで変更内容をコミットするには、先にステージエリアへコミットしたいファイルを追加する必要があるため、次のコマンドを実行します。
git add .
ステージエリアに追加できたら、コミットを実行します。
git commit
コミットできたら、次のコマンドを実行してリモートリポジトリに変更内容を反映します。
git push
リモートリポジトリから変更内容を取得
チームで開発する際には、他のメンバーの変更がどんどんリモートリポジトリに記録されていきます。それらの変更は取得操作をしない限り自分のローカルリポジトリに反映されません。リモートからローカルに変更内容を反映させるためには次のコマンドを実行します。
git pull
自分だけで試している際には何も変更がないため、実行してもあまり変化を感じにくいです。もし、友人や同僚などで付き合ってくれる方がいれば、お互いの変更をリモートリポジトリへプッシュして、相手の変更を取得してみてください。
おわりに
今回は、アプリケーション開発に不可欠なバージョン管理システムのGitについて、基本的な知識と操作を解説しました。今回紹介した以外にも、Gitには沢山の機能があります。今回の内容を元に、皆さんが実践を通して色々な機能やテクニックを使いこなせるようになり、次のステージに進むための最初の1歩になれば嬉しいです。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- DevOpsにおける開発者の振る舞いを理解しよう
- GitHub Universe 2019でプロダクトデザイナーに訊いた、易しさと高機能をバランスさせるチャレンジ
- CI/CDを実現するツール「GitHub Actions」を使ってみよう
- 複数人で1つのUnityプロジェクトを管理するには
- RustNL 2024番外編、GitのアクティビティからChagelogを生成するgit-cliffを紹介する
- これだけは押さえておきたいGitHub Flowの基礎
- Node.jsとExpress.jsで開発したWebアプリをeXcaleで動かす
- CI/CD Conference 2023、DMMのエンジニアが解説するCIを加速するトランクベースの開発とは
- 開発の生産性の向上と開発プロセスの効率化をもたらす開発ツールの活用法
- PHPとMySQLが利用できるWebサイトを、Windows Azureを使って手軽に作ってみよう