Gitの基礎 - Gitの概要

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

Gitとは、オープンソースの分散型バージョン管理システムである。(ファイルの変更履歴を管理する)
GPLライセンスの下で公開されていて、自己責任の下で、誰もがGitを使用することができる。

バージョン管理システムというと、CVSやSubversion等が有名だが、Gitは最近注目のバージョン管理システムである。

Gitの産みの親は、Linuxカーネルの産みの親でもあるLinus Torvalds氏である。
Linux kernelは、全世界に多数の開発者がいる大きなプロジェクトであるが、そのLinux kernelのソース管理にGitが使用されている。
また、X.orgやRuby on Rails、Perl、Google Android等もGitを使用しており、
特にオープンソースのプロジェクトのバージョン管理にGitが使用されるケースが増えている。


Gitの特徴

Gitの特徴は、分散型のバージョン管理システムであるということ、
それから何といっても、Linuxカーネルの開発で培われたノウハウが凝縮された高機能なバージョン管理システムであるという点である。

分散型とは、リポジトリが1箇所に集中していないという意味である。
Subversion等は1箇所のリポジトリに開発者全員が変更履歴を記録する方式ということから、リポジトリは1箇所に集中している。

一方、分散型では各開発者が自分専用のローカルリポジトリを持ってそこにコミットする。
そしてコミットした内容を、push / pullという仕組みを使って皆で共有してソフトウェアの開発を進めていく。
リポジトリが1箇所に集中せず、開発者ごとにリポジトリが分散されているから分散型ということである。

分散型のメリットは、リポジトリをWeb上で公開すれば、誰でもそのリポジトリを複製して開発に参加できるという点にある。
そこには、CVSやSubversionのようなコミッターとそれ以外といった区別はない。
誰もがリポジトリを複製して開発に参加でき、その変更が優れていれば、皆がその結果をpullしてくれる。

OSSプロジェクトで、ここ数年で爆発的にGitが使われるようになったのは、そういう理由からである。

なお、分散型のバージョン管理システムには、Gitの他にも、Bazzar、Mercurial、monotone、darcs等がある。
Gitはその中でも大変良く使用されているツールである。


Gitの基礎用語

下表に、Gitを使用する上で必要な用語を示す。

用語 説明
リポジトリ データを保存する場所。プロジェクトの全ファイルとその変更履歴を含む完全なデータベース。
Gitでは、このリポジトリ単位でデータを管理する。
修正履歴も保存されている。
リモートリポジトリ サーバにあるリポジトリ。
サーバに保存され、チーム内で共有される。

代表的なサービスとしてGitHub、GitLab、Bitbucketなどがある。
ローカルリポジトリ ローカル (自身のPC) に保存されているリポジトリ。
開発者が直接作業を行う場所。
クローン リモートリポジトリを複製すること。
修正履歴なども複製されて、完全なコピーが作成される。
ブランチ 一連の修正を、主流から枝のように分岐させて管理するもの。
ブランチでの修正内容は他のブランチの影響を受けないため、
同じリポジトリで同時に複数の開発を行うことができる。

デフォルトブランチはmain (またはmaster) と呼ばれる。
チェックアウト 他のブランチへ移動し、作業ディレクトリを任意のコミット状態にすること。
git switchコマンドでも同様の操作が可能。
ステージング (add) コミットする前に、変更したファイルをステージングエリアに追加すること。
どの変更をコミットに含めるか選択できる。
コミット 修正内容をローカルリポジトリに反映すること。
コミットメッセージを付けて変更内容を記録する。

各コミットには一意のハッシュIDが付与される。
プッシュ ローカルリポジトリの修正内容をリモートリポジトリに反映すること。
チームメンバーと変更を共有する際に使用。
プル リモートリポジトリの修正内容をローカルリポジトリに反映すること。
git fetch (変更の取得) と git merge (変更の統合) の組み合わせ。
マージ 異なるブランチの修正内容を統合すること。
マージ先とマージ元の両方に変更履歴が残る。

開発完了した機能を統合する際などに使用。
リベース ブランチの基点を別のコミットに移動すること。
履歴を直線的に保つことができるが、共有済みのブランチには使用を避ける。
コンフリクト マージする場合に、リモートとローカルで同じファイルの同じ箇所に対して修正がされており、自動でマージできないこと。
手動で、両方の修正を合わせた内容に編集する必要がある。
タグ 特定のコミットに対して名前 (タグ) を付けること。
主にバージョン番号を付ける場合に使用する。(例: v1.0.0)
.gitignore Gitで管理しないファイルやディレクトリを指定するための設定ファイル。
ビルド生成物やログファイル、IDE設定等を除外するのに使用。



Gitのインストール

Gitを使用するためには、ローカル環境でのGitの構築が必要である。

まず、Gitをローカル環境で使用できるように、Gitをインストールする。

  • Windows
    Git for WindowsからGit for Windowsをダウンロードして、インストールする。
  • Linux
    ほとんどのLinuxでは、標準でGitがインストールされている。
    もしインストールされていなかったり、より新しいバージョンのGitを利用する場合は、
    こちらのページを参照してインストールする。


次に、Gitコマンドを操作するコマンドライン環境を準備する。

  • Windows
    Gitコマンド付属のGit Bashを起動後、以下のコマンドを実行して、Gitのバージョンが表示されることを確認する。
    git --version
  • Linux
    以下のコマンドを実行して、Gitのバージョンが表示されることを確認する。
    git --version



Gitの設定

git configコマンドは、Gitの設定ファイルにある変数の値を設定するものである。

Gitの設定ファイルは3種類ある。

  • システム全体に対する設定
    /etc/gitconfig
  • ユーザごとの設定
    ~/.gitconfig
  • プロジェクトごとの設定
    .git/config


--globalオプションは、~/.gitconfigファイルに設定する。
--systemオプションは、/etc/gitconfigファイルに設定するが、使用する頻度はほとんどない。
上記のオプションを付加しない場合は、現在の作業ツリーにある.git/configファイルに設定する。

ユーザ名 / メールアドレスの設定

Gitを使用し始める場合は、まず、2つの変数user.nameと変数user.emailを~/.gitconfigに設定する。
これらの情報は、各コミットに書き込まれる名前とメールアドレスである。
ユーザ名とメールアドレスを登録する。

git config --global user.name <ユーザ名>
git config --global user.email <メールアドレス>


設定内容を確認する。

git config --list または git config --global -l

# 出力
user.name=<ユーザ名>
user.email=<メールアドレス>
...


エディタの設定

この設定は、コミット時において、変更および記録を記述する時に指定したエディタが自動的に立ち上がる。

CLIエディタ
git config --global core.editor <エディタ名>

# Nanoを設定する場合
# コマンドのパスを指定してもよい
git config --global core.editor nano

# Kateを設定する場合
# コマンドのパスを指定してもよい
git config --global core.editor kate


カラーの設定

変数color.uiをautoに指定することにより、画面表示に色が付いて視認性がよくなる。

git config --global color.ui auto


初期ブランチ

Git 2.28以降では、初期ブランチ名をmasterという名前に設定するとよい。

git config --global init.defaultBranch master



SSH接続

例えば、以下の状況で運用しているGitのリモートリポジトリに接続する。

  • リモートリポジトリがあるサーバ
    repository.example.jp (192.168.1.10)
  • リモートリポジトリのディレクトリ
    /home/ユーザ名/repository/repo.git
  • ユーザ名
    hoge
  • 接続方法
    SSH
  • ポート番号
    22


この時、以下のコマンドを実行することで、リモートリポジトリにアクセスできる。

git clone ssh://hoge@repository.example.jp:22/home/ユーザ名/repository/repo.git


ここで、SSHログイン時にパスワード認証ではなく鍵認証している場合、
秘密鍵のファイル名が標準のid_rsaファイルであるならば、上記のコマンドでアクセスできる。

しかし、運用上の都合で秘密鍵がid_rsaファイル以外にも複数存在している時がある。
そこで、秘密鍵が複数存在している場合は、サーバごとの秘密鍵の名前を示すための設定ファイルを作成する。

以下の内容で、設定ファイルである~/.ssh/configファイルを作成する。
このファイルでは、複数のサーバの設定が記載できる。

また、~/.ssh/configの設定は、Gitに限らず、全てのSSH接続で参照される。

# ~/.ssh/configファイル

Host repo.remote
    HostName repository.example.jp
    User hoge
    IdentityFile ~/.ssh/id_rsa.repo.remote
    Port 22

Host repo.local
    HostName 192.168.1.100
    User huga
    IdentityFile ~/.ssh/id_rsa.repo.local
    Port 22


以下に、設定項目の説明を記載する。

  • Host
    任意の名前(エイリアスとして使用する)
  • HostName
    接続するサーバのIPアドレスやFQDN
  • User
    サーバのユーザ名
  • IdentityFile
    秘密鍵ファイルのフルパス
  • Port
    SSHのポート番号


~/.ssh/configファイルの作成後は、アクセス権限を変更する。

chmod 600 ~/.ssh/config
chmod 700 ~/.ssh


~/.ssh/configファイルの作成後は、以下のコマンドで接続できる。

git clone ssh://repo.remote/home/ユーザ名/repository/repo.git


単純にサーバへSSH接続するだけなら、以下のようにコマンドを実行する。

# repository.example.jpへssh接続
ssh repo.remote

# 192.168.1.100へssh接続
ssh repo.local