更新日:
【IT用語】 Gitのバージョン管理の仕組みを概念から理解しよう
Gitとは、コンピュータ上のファイルに発生した変更を記録し、履歴を管理してくれる分散型バージョン管理システムです。
Gitを使うことで、複数人で同時変更する事が出来たり、それぞれの変更履歴を共有出来る機能などあります。Gitを理解してコードをバージョン管理出来るようになりましょう。
Gitのバージョン管理の仕組み
この章では、Gitのバージョン管理のシステムや流れについて解説します。
バージョン管理システム
バージョン管理システムには、集中型と分散型の2種類あります。
後述しますが、管理対象のファイルや変更の履歴などを保存する場所のことを「リポジトリ」と言います。この2種類の違いや分散型のメリットを確認します。
分散型と集中型の違い
集中型は、ネットワークに接続した状態で中央のリポジトリを複数人で共有します。
一方で、分散型は、ネットワークに接続しなくても自分のパソコンにリポジトリを持つことが出来ます。Gitは、分散型のバージョン管理システムです。
分散型のメリット
分散型は集中型と比べて手間の様に見えますが、下記の様なメリットがあります。
- オフラインでも開発する事が出来る
- 他の人のコードが影響を及ぼす事がない
- リポジトリが分散されているので、復元しやすい
バージョン管理について詳しくは「バージョン管理とは?」を参考にしてください。
バージョン管理の流れ
Gitの分散型バージョン管理システムの全体の流れは、下記の様になります。
- リモートリポジトリ - 専用サーバーに置いてあるリポジトリ
- ローカルリポジトリ - 自分のローカル(パソコン)に置くリポジトリ
- インデックス - ローカルリポジトリにコミット(変更を記録)する前の準備場所
- ワークツリー - Gitの管理下にある作業場所
これからは重要な箇所なので、順番に詳しく解説していきます。
「リモートリポジトリ」と「ローカルリポジトリ」
リポジトリとは、ファイルの変更を記録する場所です。
リポジトリには、「リモートリポジトリ」と「ローカルリポジトリ」があります。リポジトリを2つに分けると、自分の作業を手元のローカルで行う事が出来ます。
- リモートリポジトリ …専用サーバーに置いてあるリポジトリ
- ローカルリポジトリ…自分のローカル(パソコン)に置くリポジトリ
作業したものをアップロードする場合は、「ローカルリポジトリからリモートリポジトリにpush(プッシュ)」します。
最新のリモートリポジトリの情報を取得する場合は、「リモートリポジトリからローカルリポジトリにpull(プル)」します。他の人が作業した内容も含まれます。
コミット
コミットとは、リポジトリに対してファイルの変更や修正を記録する操作のことです。
コミットを実行すると、現在からコミットされた差分の変更がリポジトリ内に記録されます。リポジトリ内では、コミット単位で時系列の順番に格納されます。
これにより、過去の変更履歴を辿れる様になります。
ワークツリーとインデックス
ワークツリーとインデックスは、それぞれGit管理下に配置される作業場所とリポジトリにコミットする為の前の準備場所です。
- インデックス…ローカルリポジトリにコミット(変更を記録)する前の準備場所
- ワークツリー…Gitの管理下にある作業場所
ワークツリーは、実際に変更や修正を行った最新のファイルがあります。その変更したファイルの状態をインデックスにadd(登録)します。変更されていないファイルは、インデックスにaddしても反映されません。
インデックスが必要な理由とは?
ワークツリーでファイル変更したものをそのままローカルリポジトリにコミットすれば良さそうですが、なぜインデックスが必要なのでしょうか?
それは、インデックスを間に挟むことによって、ワークツリーにある全てのファイルではなく、変更したファイルや一部のみをコミットすることが出来るからです。
そして、インデックスで設定した内容がリポジトリにコミットされるので、コミットする前にワークツリーからインデックスに対して、add(登録)が必要になるのです。
▼ Git初学者におすすめの1冊!実際にGithubを使いながらプルリクエストまで学ぶことができます。図解が豊富で初心者向けの参考書です。
GitHub、SourceTree、コマンド操作対応!
Gitの使い方
この章では、Gitの導入方法から使い方まで1つ1つ解説します。
Gitのインストール
Gitは、こちらの公式サイトからインストールします。
1.公式サイトにアクセスして「Downloads」を選択します。
2.赤枠の中から自分の環境に合うものを選んでダウンロードします。
ダウンロードが開始されない場合は、「click here to download manually.」のリンクを選択します。
3.「git-2.2.1-intel-universal-mavericks.dmg」というファイルがダウンロードされます。下記の様に箱のアイコンをクリックします。
インストール画面が開くので指示にしたがってインストールを進めて下さい。インストールされたか確認するには、「ターミナル」を開いて下記のコマンドで確かめる事が出来ます。
1
$ git --version
コマンド操作
「バージョン管理の全体図」にあるpush, commit, addなどをコマンドで操作する方法を解説していきます。
add(登録する)
ワークツリーで変更・更新したファイルをインデックスに登録します。
これは、「addコマンド」を使います。
1
$ git add <登録したいファイル名>
<登録したいファイル名>を.(ドット)にすると、変更された全てのファイルがインデックスに登録されます。
1
$ git add .
「add」と「.」の間にはスペースが入るので注意しましょう!
commit(記録する)
インデックスに登録された設定をローカルリポジトリに記録するには、「commitコマンド」を使用します。
オプション「-m」は、コミット内容のメッセージを入れます。これによって、このコミットが何を変更したか分かりやすくなります。
1
$ git commit -m "コミット内容"
ワークツリーで変更したファイルをインデックスに登録する際に「addコマンド」を使っていましたが、インデックス登録とコミットを下記のコマンドで同時に実行する事が出来ます。
1
$ git commit -am "コミット内容"
push(リモートリポジトリに反映させる)
ローカルリポジトリに記録された変更履歴をリモートリポジトリに反映させる為に「pushコマンド」を使います。
1
$ git push origin master
origin masterは、今はおまじないみたいなものと思っていてください。後述ブランチの箇所で解説させて頂きます。
pull(最新のリポジトリの情報を取り込む)
リモートリポジトリからローカルリポジトリに最新の情報を取り込むには、「pullコマンド」を使います。
1
$ git pull origin master
ブランチ
Gitには、作業を複数人で分散し、並行して進められるブランチという機能があります。ブランチは、履歴の流れを分岐して記録していきます。
現行プロジェクトのバージョンから機能追加・バグ修正が出た場合に、ブランチを切って作業に取り組みます。分岐したブランチは、他のブランチの影響がないので、同時に作業の変更をすることが出来ます。
ブランチ(branch)は、「(木の)枝、枝状のもの、支流」という意味があります。「木の根幹から枝分かれさせる」つまり現行プロジェクトのバージョンからブランチを切って機能追加・バグ修正など他の作業をするときに使われます。
並行作業のイメージ
ブランチを使うと複数の作業を並行で行う事が出来ますが、具体的にどの様な流れになるのか下記のWebサイトを参考に確認していきます。
Webサイトでは、現行バージョン(メインのブランチ)から検索機能やサイドバー追加・ロゴ修正をしていきます。
作業の流れは下記の通りです。
各担当者は、他の作業に影響を与えない為にブランチを切って作業を開始します。
作業が終わった後に、各担当者は現行バージョン(メインのブランチ)に自分が作業したブランチを合流(merge)させます。
作業ブランチを合流させることで、メインブランチに変更・修正した結果を反映する事が出来ます。
この様に、ブランチを使ってそれぞれの作業に履歴を残す事で、追加内容を取り消したりエラーが発生した場合に履歴を追って調査する事が出来ます。
ブランチ作成
作業を開始する際に、メインブランチから作業ブランチを作成します。安定したメインブランチのことをmasterブランチと言います。masterブランチから作業ブランチを作成するには、一旦masterブランチに切り替えてから下記のコマンドを実行します。
1
2
3
4
5
6
# masterブランチに切り替え
$ git checkout master
# ブランチ作成し作成したブランチ切り替える
$ git branch <ブランチ名>
$ git checkout <作成したブランチ名>
ブランチ作成して切り替えるコマンド操作は、下記の様に1回で実行する事が出来ます。
1
$ git branch -b <ブランチ名>
チェックアウト(git checkout)という操作によって、切り替えられたブランチ内の最後のコミット内容がワークツリーに展開されます。
ブランチを作成する前にmasterブランチに切り替えることによって、masterブランチの最後の履歴を引き継いで作業ブランチを作成する事が出来ます。
現在自分が作業している場所を示すポインタ(直前のコミット)のことをHEADと言います。つまりチェックアウトの操作は、「HEADの移動 + ワークツリーへの展開」がされています。
merge(マージ)
機能追加・修正ごとにブランチを切って、それぞれの作業が終わったら各ブランチをメインブランチに合流させます。ブランチを合流させることをmergeすると言います。
masterブランチに作業したブランチを合流させるには、一旦masterブランチに切り替えて下記のコマンド操作を行います。
1
2
3
4
5
# masterブランチに切り替える
$ git checkout master
# masterブランチに作業ブランチをmergeする
$ git merge <作業ブランチ名>
「git mergeコマンド」は、指定したブランチがHEAD(チェックアウトしたブランチの直前のコミット)に取り込まれます。作業したブランチをメインブランチにmergeすることで、作業内容を反映させる事が出来ます。
GitHubの使い方
GitHubとは、Gitのバージョン管理システムを利用したWebサービスの事です。
実際に開発する時は、この様なGitの仕組みを使ったWebサービスを利用する事が多いです。詳しくは、「GitHubの使い方」の記事を参考にしてください。
この記事のまとめ
- Gitとは、コンピュータ上のファイルに発生した変更を記録し、履歴を管理してくれるバージョン管理システムのこと
- バージョン管理システムには、「集中型」と「分散型」の2種類あり、Gitは「分散型」になる
- ローカルにリポジトリを置く事が出来るので、自分のパソコン内で全ての操作を行う事が出来る