1. Gitとは
Gitとは、分散型バージョン管理システムです。噛み砕いていうと、ファイルのバージョン管理がとても簡単になるツールです。通常、ファイルを更新すると、古いバージョンには戻せません。ただ、Gitで管理しているファイルであれば、Git上でファイルの編集履歴を管理できるので、編集前のファイルの内容を保存したまま、編集後のファイルも保存することが出来ます。 例えば、ファイルを更新してエラーが起きたときに、一旦変更前に戻したいとします。そのとき、コードを一文一文直していたら手間がかかります。自分ひとりのプロジェクトなら少しの労力ですみますが、数十人以上の規模の大きいプロジェクトとなると、ファイル数も多いので、結構な手間がかかります。そういった際に、無駄なく処理を行えるのがGitというツールになります。
上記はほんの一例ですが、ほかにも下記のようなことがGitによって可能になります。
1. 新旧のファイルを一括管理
2. 前のバージョンのファイルに戻れる
3. チームでファイルの変更履歴を共有
4. 複数のメンバーで修正した部分の統合
5. チーム開発の効率化
2. Gitの基礎
2.1 基礎用語
まずはGitを理解するうえで重要な用語を紹介します。
repository
repositpry(リポジトリ)は、ファイルやディレクトリの状態や変更履歴を記録しておく場所です。Gitのリポジトリにはリモートリポジトリとローカルリポジトリという2種類が存在します。リポジトリのディレクトリ内に.git
というディレクトリが存在します。ここにコミットの記録や差分などのリポジトリの情報が保存されています。
- リモートリポジトリ:インターネットやサーバー上に存在するリポジトリで複数の開発者間で共有することができます
- ローカルリポジトリ:開発者個人のPCなどローカル環境で作業を行うためのリポジトリです
commit
commit(コミット)とは、ファイルやディレクトリの変更を記録することです。
コミットにはコミットメッセージという作業の内容を記したメッセージを付与する必要があります。コミットメッセージに決まった書式はありませんが、1行目に変更内容の概要、2行目を空白行として3行目以降に変更内容の詳細を記述する書き方が一般的です。
clone
clone(クローン)は、既存のリポジトリをローカル環境にコピーすることです。
プロジェクト本体のリポジトリは既に作成されているものの、自分のローカル環境に何もない状態の時などに使用します。
branch
branch(ブランチ)とは、日本語で枝という意味であるようにプロジェクト本体からの分岐を作成することです。ブランチはデフォルトのmainブランチと、トピックブランチと呼ばれるmainから分岐するブランチが存在します。
ブランチでは他のブランチから分離して作業を進めることができます。
例えば、複数人で開発を行うプロジェクトで機能の追加やバグ修正などいくつかの作業を並行して行う必要があるとします。その際、トピックブランチを各々が作成することで他のメンバーの作業や変更点の影響を受けずに独立した状態で機能の追加や修正作業を進めることができます。
そして、次に紹介するマージという機能によって作業が終了したブランチをmainブランチに統合することができます。
merge
merge(マージ)は、分岐したブランチを統合することです。
例えば、バグ修正のために新たにブランチを作成しその作業が完了した場合、その変更内容をプロジェクト本体と統合する必要があります。この統合のために使用される機能がマージです。
push
push(プッシュ)は、コミットしたファイルやディレクトリをローカルリポジトリからリモートリポジトリにアップロードすることです。
コミット段階では変更内容の記録はローカルリポジトリのみに対して行われており、プッシュすることで初めて変更内容が他の開発者と共有されます。
pull
pull(プル)は、リモートリポジトリ内にあるものをローカルリポジトリに反映させることです。つまりプッシュがローカルからリモートへのアップロードであるのと反対に、プルはリモートからローカルへのダウンロードです。
プルしたコンテンツはリモートから独立したものと見なされ、以降のローカルでの変更内容はコミット、プッシュするまでリモートには反映されません。
fetch
fetch(フェッチ)は、リモートリポジトリ上の差分をローカルリポジトリに反映することなく、差分の情報の取得のみを行います。これによりプルを行ってリモートの変更を適用する前に、更新分の変更が衝突しないかどうかを確認することができます。フェッチでデータを取得した後にマージを行うという二つのステップを踏むことで、間違った操作を避け安全にリモートの差分を取得することができます。
2.2 GitHub/GitLab
実際にGitを使用する場合には、GitHubまたはGitLabのようなサービス/プラットフォームを使用することが一般的です。
GitHub
GitHubはソフトウェア開発プラットフォームの一つで、8300万人以上のユーザーと2億件以上の豊富なリポジトリを持つ世界最大のGitのサービスです。
GitHubではリポジトリを用途に応じて公開・非公開の設定をすることができます。公開設定のリポジトリをパブリックリポジトリと呼び、インターネット上で共有や参照が可能な状態です。非公開設定のリポジトリはプライベートリポジトリと呼ばれ、機密性の高いファイルや外部に公開したくないプロジェクトに利用するものです。プライベートリポジトリは以前は有料プランの機能でしたが現在は誰でも無料で作成することができます。
また、GitHubは開発プラットフォームであることに加え、開発者のためのコミュニティという側面も持っているため公開されているオープンソースコードに対して開発者間で日々活発なコミュニケーションが行われています。これによってGitHub上では新たなプログラミング言語やアプリケーション、先進的な技術が生み出されています。
GitLab
GitLabはGitHubをもとに開発されたDevOpsのオープンソースソフトウェア(OSS)です。GitHubが開発者間のコミュニケーションに焦点を当てている一方、GitLabはプロジェクトやチームの管理など信頼性に重きを置いたアプリケーションです。
例えば、GitHubを含む従来のサービスを利用してDevOpsを実現する場合、プロジェクト管理、ホスティング、CI/CD、デプロイなど各工程で異なるツールを導入する必要がありました。しかし、GitLabはこれらのツールを一つにまとめたDevOps支援アプリケーションとして開発されているため、効率的な開発が可能です。
また、プロジェクトにおける課題提起と対応状況、ToDoやコードレビューに関する機能などプロジェクト管理を円滑にするための機能はGitHub以上に豊富に取り揃えられています。
Avintonでは各プロジェクトごとに異なるリポジトリでコード管理を行うためにGitを使用しています。
具体的には、GitLabに実装されている他の機能と合わせて、タスク管理、タスクの割り当て、ワークフローの設計、CI/CDツールチェーンの統合、バグ追跡などを行なっています。例えば以下の画像にあるissue boardと呼ばれるGitLabの機能を利用することで、タスク管理やワークフローの確認を簡単に行うことができます。
Ref: GitLab – issue board
3. Git基礎教材
より詳しくGitを理解するための教材として以下を紹介します。いずれも日本語で無料で利用できる教材です。
- Pro Git book
- 1, 2, 3章が基本の理解のために役立ちます
- Git Guide
- 10分程度のチュートリアルです。
4. 演習
基本的な概念やコマンドを理解したら、実際に手を動かして理解を深めましょう。
4.1 Learn Git Branching
オープンソースで作成された、Webブラウザ上でGitコマンドを練習できるLearn Git Branchingがあります。こちらでは基本的なレベルから複雑な操作までインタラクティブに学習することができます。「まずはここから」と「次のレベルに進もう」の合計8つのシナリオをクリアしてみましょう。興味がある方はその続きのコースも進めてください。
4.2 Gitコマンド演習課題
次の通りローカルリポジトリを作成してください:
1. mywork
という名前のディレクトリを作成
2. Gitレポジトリとして初期化
3. 今日の日付をtoday.txt
に書き込み、そのファイルをコミットする
4. master
ブランチからtomorrow
という名前のブランチを作成
5. today.txt
の日付を明日の日付に更新しコミットする
6. tomorrow
ブランチをmaster
ブランチにマージ
7. git log
コマンドで2つのコミットが表示されていることを確認
8. tomorrow
ブランチを削除
4.3 Q&A
以下の質問について調べてみてください。
- 上記課題において、
.git
ディレクトリはどこのコマンドで作成されましたか - ファイルをコミットする前に差分を確認するにはどのコマンドを使いますか
.gitignore
はどのような場合に便利ですかgit status
はどのような場合に便利ですか
5. GitとDevOps
Ref: Wikipedia – Devops-toolchain
このようにGitは様々な機能を提供していますが、他にも近年開発の主流になりつつあるDevOpsを実践する上でも非常に有用なシステムです。DevOps(デブオプス)とは、アジャイル開発においてDEVelopment(開発)とOPeration(運用)を組み合わせる概念です。この概念は、これまで異なるフィールドだった開発と運用の連携強化によって開発スピードやアプリケーションの安定性向上を目指しています。DevOpsを導入することで、アジャイル開発において重要な効率的で安全なソフトウェアライフサイクルを実現することを目指します。
CI/CDはそれぞれContinuous Integration(継続的インテグレーション)とContinuous Delivery(継続的デリバリー)を指しています。CIはソースコードを自動でビルド・テストすることで、効率的かつ素早く不具合を見つけ、修正することを目的とするプロセスです。一方、CDはCIのテストをパスしたコードが本番環境にデプロイされるまでのプロセスを自動化するものです。このようにCI/CDはビルド・テスト・デリバリーを自動的に行うことであり、これはDevOpsを実現する上で最も重要な仕組みの一つです。
ここではDevOpsを実現するための一つとしてCI/CDを紹介しましたが、実際にはCI/CDの他に調査やプロジェクト自体の管理が必要であるなどDevOpsを実践する上でクリアしなければいけない課題はいくつかあります。そこで、Gitリポジトリ機能や多くのDevOps機能を備えるGitLabやGithubなどのシステムを利用し、プロジェクト全体の管理からアプリケーションの運用までカバーすることがあります。Gitに対する理解を深めることはモダンな開発フローを実践していく上でも非常に重要です。
6. まとめ
Gitを効率的に使用することによって、チームでの開発を加速することができます。近年ではDevOpsの技術と組み合わせて、ソフトウェアライフサイクルを管理するための一部として重要な技術になっています。多くオープンソースのアプリケーションはGithub上で開発されました。Gitを使用することで、個人や小さいチームでの開発だけではなく、世界中に分散しているプログラマーがコードの変更や修正を衝突することなく、協力して効率的に開発を行うことができます。