【IT用語】Gitのバージョン管理の仕組みを概念から理解しよう

IT用語

Gitとは、コンピュータ上のファイルに発生した変更を記録し、履歴を管理してくれる分散型バージョン管理システムです。

バージョン管理の流れ

Gitを使うことで、複数人で同時変更する事が出来たり、それぞれの変更履歴を共有出来る機能などあります。Gitを理解してコードをバージョン管理出来るようになりましょう。

Gitのバージョン管理の仕組み

この章では、Gitのバージョン管理のシステムや流れについて解説します。

バージョン管理システム
リンクをコピーしました

バージョン管理システムには、集中型と分散型の2種類あります。

後述しますが、管理対象のファイルや変更の履歴などを保存する場所のことを「リポジトリ」と言います。この2種類の違いや分散型のメリットを確認します。

分散型と集中型の違い
リンクをコピーしました

集中型は、ネットワークに接続した状態で中央のリポジトリを複数人で共有します。

集中型のイメージ

一方で、分散型は、ネットワークに接続しなくても自分のパソコンにリポジトリを持つことが出来ます。Gitは、分散型のバージョン管理システムです。

分散型のイメージ

分散型のメリット
リンクをコピーしました

分散型は集中型と比べて手間の様に見えますが、下記の様なメリットがあります。

  • オフラインでも開発する事が出来る
  • 他の人のコードが影響を及ぼす事がない
  • リポジトリが分散されているので、復元しやすい

バージョン管理について詳しくは「バージョン管理とは?」を参考にしてください。

バージョン管理の流れ
リンクをコピーしました

Gitの分散型バージョン管理システムの全体の流れは、下記の様になります。

バージョン管理の流れ

  • リモートリポジトリ …専用サーバーに置いてあるリポジトリ
  • ローカルリポジトリ …自分のローカル(パソコン)に置くリポジトリ
  • インデックス …ローカルリポジトリにコミット(変更を記録)する前の準備場所
  • ワークツリー …Gitの管理下にある作業場所

これからは重要な箇所なので、順番に詳しく解説していきます。

「リモートリポジトリ」と「ローカルリポジトリ」
リンクをコピーしました

リポジトリとは、ファイルの変更を記録する場所です。
リポジトリには、「リモートリポジトリ」と「ローカルリポジトリ」があります。リポジトリを2つに分けると、自分の作業を手元のローカルで行う事が出来ます。

「リモートリポジトリ」と「ローカルリポジトリ」

  • リモートリポジトリ …専用サーバーに置いてあるリポジトリ
  • ローカルリポジトリ…自分のローカル(パソコン)に置くリポジトリ

作業したものをアップロードする場合は、「ローカルリポジトリからリモートリポジトリにpush(プッシュ)」します。

最新のリモートリポジトリの情報を取得する場合は、「リモートリポジトリからローカルリポジトリにpull(プル)」します。他の人が作業した内容も含まれます。

コミット
リンクをコピーしました

コミットとは、リポジトリに対してファイルの変更や修正を記録する操作のことです。

コミットを実行すると、現在からコミットされた差分の変更がリポジトリ内に記録されます。リポジトリ内では、コミット単位で時系列の順番に格納されます。

これにより、過去の変更履歴を辿れる様になります。

ワークツリーとインデックス
リンクをコピーしました

ワークツリーとインデックスは、それぞれGit管理下に配置される作業場所とリポジトリにコミットする為の前の準備場所です。

ワークツリーとインデックス

  • インデックス…ローカルリポジトリにコミット(変更を記録)する前の準備場所
  • ワークツリー…Gitの管理下にある作業場所

ワークツリーは、実際に変更や修正を行った最新のファイルがあります。その変更したファイルの状態をインデックスにadd(登録)します。変更されていないファイルは、インデックスにaddしても反映されません。

インデックスが必要な理由とは?
リンクをコピーしました

ワークツリーでファイル変更したものをそのままローカルリポジトリにコミットすれば良さそうですが、なぜインデックスが必要なのでしょうか?

それは、インデックスを間に挟むことによって、ワークツリーにある全てのファイルではなく、変更したファイルや一部のみをコミットすることが出来るからです。

そして、インデックスで設定した内容がリポジトリにコミットされるので、コミットする前にワークツリーからインデックスに対して、add(登録)が必要になるのです。

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コマンド」を使います。

git操作addコマンド

ターミナル | 任意のファイルをインデックスに登録する
1
$ git add <登録したいファイル名>

<登録したいファイル名>を.(ドット)にすると、変更された全てのファイルがインデックスに登録されます。

ターミナル | 変更した全てのファイルをインデックスに登録する
1
$ git add .

「add」と「.」の間にはスペースが入るので注意しましょう!

commit(記録する)
リンクをコピーしました

インデックスに登録された設定をローカルリポジトリに記録するには、「commitコマンド」を使用します。

git操作commitコマンド

オプション「-m」は、コミット内容のメッセージを入れます。これによって、このコミットが何を変更したか分かりやすくなります。

ターミナル | コミットする
1
$ git commit -m "コミット内容"

ワークツリーで変更したファイルをインデックスに登録する際に「addコマンド」を使っていましたが、インデックス登録とコミットを下記のコマンドで同時に実行する事が出来ます。

ターミナル | addとcommitを同時に実行する
1
$ git commit -am "コミット内容"

push(リモートリポジトリに反映させる)
リンクをコピーしました

ローカルリポジトリに記録された変更履歴をリモートリポジトリに反映させる為に「pushコマンド」を使います。

git操作pushコマンド

ターミナル | リモートリポジトリ に反映させる
1
$ git push origin master

origin masterは、今はおまじないみたいなものと思っていてください。後述ブランチの箇所で解説させて頂きます。

pull(最新のリポジトリの情報を取り込む)
リンクをコピーしました

リモートリポジトリからローカルリポジトリに最新の情報を取り込むには、「pullコマンド」を使います。

git操作pullコマンド

ターミナル | 最新のリポジトリの情報を取り込む
1
$ git pull origin master

ブランチ
リンクをコピーしました

Gitには、作業を複数人で分散し、並行して進められるブランチという機能があります。ブランチは、履歴の流れを分岐して記録していきます

現行プロジェクトのバージョンから機能追加・バグ修正が出た場合に、ブランチを切って作業に取り組みます。分岐したブランチは、他のブランチの影響がないので、同時に作業の変更をすることが出来ます。

履歴の流れ

ブランチ(branch)は、「(木の)枝、枝状のもの、支流」という意味があります。「木の根幹から枝分かれさせる」つまり現行プロジェクトのバージョンからブランチを切って機能追加・バグ修正など他の作業をするときに使われます。

並行作業のイメージ
リンクをコピーしました

ブランチを使うと複数の作業を並行で行う事が出来ますが、具体的にどの様な流れになるのか下記のWebサイトを参考に確認していきます。

Webサイトでは、現行バージョン(メインのブランチ)から検索機能やサイドバー追加・ロゴ修正をしていきます。

branchの並行作業の例

作業の流れは下記の通りです。

  • 各担当者は、他の作業に影響を与えない為にブランチを切って作業を開始します。

  • 作業が終わった後に、各担当者は現行バージョン(メインのブランチ)に自分が作業したブランチを合流(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ブランチに切り替えて下記のコマンド操作を行います。

masterブランチに作業ブランチをmergeする
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は「分散型」です。
  • ローカルにリポジトリを置く事が出来るので、自分のパソコン内で全ての操作を行う事が出来る