git - バージョン管理システムを利用する

git

Gitは分散型のバージョン管理システムになります。GitはSubversionのような集中型のバージョン管理システムと異なり、ファイルのすべての変更履歴をそれぞれのマシンが持ちます。そのため、リポジトリを管理しているサーバーにアクセスできなくても、プロジェクトの履歴を確認することができます。

スポンサーリンク

Gitのインストール

Linuxの場合はパッケージ管理ツールを利用するのが簡単です。

例えば、apt-getを利用する場合は以下のコマンドでインストールを行うことができます。

sudo apt-get install git-all

または、Gitの基本的な機能のみをインストールする場合、

sudo apt-get install git
Ubuntu 16.04の場合、git-allをインストールする場合にgit-daemon-sysvinitをインストールする必要があるかもしれません。

sudo apt-get install git-daemon-sysvinit

また、Windowsの場合はGitの公式サイトよりインストーラをダウンロードすることができます。

Gitの初期設定

Gitのコンフィグファイルについて、Linuxの場合、全てのユーザに対して、/etc/gitconfigで設定できます。コマンドを用いて設定する場合、例えば、

sudo git config --system <設定したい項目>

で設定を行うことができます。

個人のユーザに対しては ~/.gitconfig または ~/.config/git/config で設定できます。コマンドを用いて設定する場合、例えば、

git config --global <設定したい項目>

で設定を行うことができます。

単一のリポジトリの場合に対しては .git/config で設定できます。コマンドを用いて設定する場合、例えば、

git config <設定したい項目>

または

git config --local <設定したい項目>

で設定を行うことができます。

ユーザ名とメールアドレスを設定

Gitを使用する際の初期設定として、ユーザ名とメールアドレスを設定します。ユーザ名やメールアドレスは誰がリポジトリに書き込んだかの情報としてよく見る事になるでしょう。

ここでは以下の設定を使用します。

上の設定は、設定例としてのユーザ名と架空のメールアドレスを使用しています。
実際に使用する場合は、自分のユーザ名とメールアドレスを設定してください。

また、設定の内容を確認する場合は以下のコマンドが利用できます。

スポンサーリンク

プロンプト文字を設定

bashでは環境変数PS1を変更することでプロンプトの文字を変更することができます。

Gitをインストールした場合、__git_ps1関数が設定されます。

例えば、私の環境では、bash_completionが読み込まれるときに /etc/bash_completion.d/git-prompt を読み込み、 /usr/lib/git-core/git-sh-prompt で__git_ps1関数が読み込まれます。

__git_ps1関数を用いてプロンプトの文字を設定するとGitを使用するときに現在のブランチを表示できます。

git-prompt.shの設定例として、

があります。これを設定すると以下のようにユーザ名、ホスト名、カレントディレクトリ名、現在のブランチが表示されます。

以降のコマンド例では、PS1の設定を

にし、Gitのリポジトリがあるディレクトリのときに、プロンプトの文字にブランチ名のみを表示します。また、ディレクトリにGitのリポジトリがない場合は、$の記号のみがプロンプトの文字として表示されます。

Gitの簡単な操作

Gitには多くのサブコマンドがあります。Gitの操作はサブコマンドを利用し操作できます。ここでは、Gitの簡単な操作としてリポジトリの作成、リポジトリのクローン、Gitでの簡単なファイル管理の方法を確認します。

リポジトリの作成

Gitでファイルを管理するにはリポジトリを作成しなければなりません。リポジトリを作成する方法は、大きく2つあります。

1つ目は空のリポジトリを作成する方法です。

2つ目は既存のリポジトリから複製して、ローカル環境にリポジトリをコピーする方法になります。

空のリポジトリの作成
(git init)

空のリポジトリを作成するには、git initコマンドを利用することで空のリポジトリ(.gitディレクトリ)を作成することができます。

.gitディレクトリにはGitで保存したファイルのデータの実体、ブランチや特定のバージョンへの参照等のメタ情報が管理されています。

git initの簡単な構文は以下のようになります。

git init [option]... [directory]

directoryを省略した場合、基本的にカレントディレクトリに.gitディレクトリを作成します。もし、環境変数GIT_DIRが設定されている場合は環境変数GIT_DIRのパスのディレクトリを作成し、その中に.gitディレクトリを作成します。

directoryを指定した場合、そのディレクトリを作成し、その中に.gitディレクトリを作成します。

コマンド例と実行結果(directoryを省略)

コマンド例と実行結果(directoryを指定)

.gitディレクトリの内容は以下のような内容になっています。
gitディレクトリの内容

.gitディレクトリの内容について簡単な解説を行うと、

.git/hooksは特定の名前のファイルがあると、gitの特定の操作に対してそのファイルを実行するようなファイルが入ります。
.git/HEADはGitでよく使うHEADの参照が記述されています。
.git/configはGitでのリポジトリへの設定が記述されています。
.git/objectsはGitで保存するファイルのデータの実体が入ります。
.git/refsはリポジトリでのブランチやタグやリモートサーバ等の参照情報が入ります。
.git/info/excludeはGit操作で無視したいファイルパターンを記述できます。
.git/descriptionはGitWebを使用するときのリポジトリの説明を記述できます。

manページを参照する場合、.gitディレクトリの内容についての情報はgitrepository-layout(5)にまとめられています。
コマンド例

リポジトリのクローン
(git clone)

既存のリポジトリが存在する場合、git cloneコマンドを用いることで既存のリポジトリを複製し、ローカル環境に新しいディレクトリとしてリポジトリを作成することができます。

既存のリポジトリが存在する場所は、リモート環境、ローカル環境のどちらでも指定できます。

git cloneの簡単な構文は以下のようになります

git clone [option]... <repository> [directory]

repositoryは既存のリポジトリの場所を指定します。
リモート環境の場合は、https://example.com/repo.gitやgit://example.com/repo.gitのようなURLを指定できます。
ローカル環境の場合は、ファイルパスまたはfile://のようなURLを指定できます。

directoryは作成されるディレクトリの名前を指定できます。省略されている場合は、複製されるリポジトリからhttps://example.com/repo.gitならばrepoの部分が、/gitrepo/project_name/.gitならばproject_nameの部分が作成されるディレクトリの名前として使用されます。

コマンド例と実行結果

空のリポジトリをコピーしたため、warningが表示されています。
空ではないリポジトリにするためにfile.txtをリポジトリに保存し、git cloneを行うと以下のようにwarningは表示されません。
コマンド例と実行結果

ファイルをGitで管理

git statusコマンドはGitでのファイル管理の状態を確認することができます。例えば初期化した状態のリポジトリの内容を確認すると

のように表示されます。まだ何もファイルのバージョンを管理していない(ファイルをコミットしていない)ため、Initial commitのような文字が表示されています。

カレントディレクトリにfile.txtという名前のファイルを作成して、もう一度確認を行うと、

Untracked filesの場所にfile.txtが表示されます。これはGitがfile.txtは追跡していない(管理していない)という意味になります。

管理していないファイルは、git addコマンドを用いることで、Gitはファイルを管理できます。

Gitでファイルを管理するのを始めたてのときは、管理に追加したいファイルが多くありますかもしれません。その場合は、.を用いて、カレントディレクトリを指定することでカレントディレクトリ内のサブディレクトリまで一気にファイルを追加することができます。

git addコマンドではファイルを追加した時点でのファイルのデータが一時的に保存されます。git addコマンドをした後にファイルを修正した場合は、git addコマンドをやり直さなければなりません。

しかし、まだリポジトリに保存されていません。
データは一時的に保存がされている状態(ステージングエリアにある状態)で、リポジトリに保存するための前段階になります。ステージングエリアがあることでどのファイルから順番にリポジトリに保存するかを選択できます。リポジトリの歴史の管理方法によっては、どのように修正内容の見ていくかによって変わります。

ステージングエリアにあるファイルを実際にリポジトリに保存するには、git commitコマンドを用います。単純にgit commitコマンドを用いるとエディタが開きます。

エディタの変更は以下のようなコマンドで変更できます。ここではviに変更してます。

また、環境変数GIT_EDITORを用いることで上の設定より優先して指定したエディタを用いることができます。Bashでは、環境変数の代入をコマンドの最初に付けることで、その環境変数を一時的に利用できます。そのため、エディタを変更するために、

のようにして、git commitコマンドを利用すると指定したエディタを開くことができます。

git commitコマンドでメッセージを書き、そのメッセージを保存して終了したら、リポジトリにファイルを保存できます。

リポジトリにファイルを保存した後はgit logコマンドで、リポジトリに保存した内容を確認できます。

commitの右にあるアルファベットと数字の羅列はハッシュ値になり、gitは、このハッシュ値でファイルのデータやコミット情報などのオブジェクトを管理しています。

より簡潔なログを確認するにはgit logコマンドの--onelineオプションが便利になります。

また、Gitで管理しているファイルを今後修正した場合、git addコマンドを使ってステージングエリアに登録しなくても、git commitコマンドの-aオプションを用いることで、修正したファイルすべてを自動的にステージングエリアに登録してリポジトリに保存することができます。

また、git commitコマンドの-mオプションを用いると一行でのコメントを記述することができます。

また、ファイルを削除し、Gitの管理からもそのファイルを取り除きたい場合は、git rmコマンドが利用できます。

git cloneコマンドを用いたファイルのダウンロードについて

git cloneコマンドはファイルをダウンロードするのにもよく利用されます。ファイルのみをダウンロードしたい場合は、--depthオプションを利用すると便利です。
Gitは分散型のバージョン管理システムと呼ばれ、それは個々のマシンがバージョン管理のすべての歴史をコピーするためです。
しかし、ファイルのダウンロードのみしたい場合はそのようなバージョン管理のすべての歴史はいらないので、--depthオプションでどこまでの歴史がほしいかを指定するとファイルのダウンロード時間を短縮できます。

git clone --depth 1 <repository>

例えば、Gitを使用して、Gnu Coreutilsのソースコードのダウンロード時間を見てみます。

コマンド例と実行結果

最初は--depthオプションで1を指定して最新の歴史のみをダウンロードした場合で、ダウンロード時間は約8秒になりました。
次は、--depthオプションを使用せずに全ての歴史をダウンロードした場合で、ダウンロード時間は約68秒になりました。

git cloneコマンドでファイルのみをダウンロードしたい場合は、--depthオプション使用して最新の歴史のみをダウンロードするとダウンロード時間を大幅に短縮できる可能性があるので覚えておくと役立ちます。

スポンサーリンク