git : バージョン管理

Last Change: 09-Sep-2015.
author : qh73xe

これは何?

git は今一番有名なバージョン管理ツールです. 正確にはプログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムですね. もとはLinuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されています.

なお,私自身は github からの git 利用者ではなく,研究室のサーバーに直接 git 環境を作成している人間です. そのため,このページでお話できるのは github についてではなく, git 自体の説明です.

導入方法

Linux でしたら通常はレポジトリに登録されているはずです. 例えば OpenSUSE からだったら,zypper から導入することができます.

$ sudo zypper in git
  • その他 apt-get, dnf 何でもよいでしょう.

基本的な使い方

さて,このツールは基本的には サーバー to ローカルで使用していくツールになります. ここではあるサーバーに共有のレポジトリを作成し,複数PCでそれを編集していることを 前提に考えます.

  • ここでは複数PCであるディレクトリを共有することを主眼に説明を行いますが, git の本質はあくまでもディレクトリの履歴を管理し,戻ることが可能であるということだと思います.

注釈

レポジトリとは

あんまり難しいことを考えずに言うなら git で管理をしているディレクトリ自身だと思えばよいです. git ではあるディレクトリ単位で,ファイルの作成,編集,削除,その他変更履歴を管理します. 要はディレクトリの history を管理できるわけです. それで,この履歴にしたがって,管理しているディレクトリを何時いつの状態に戻すとか, 別のパソコンに,おんなじディレクトリを再現することが可能になります.

サーバーに共有レポジトリを作成する

そのため,まずはサーバーで git のレポジトリを作成する方法から説明していきます. サーバーにログインし,任意のディレクトリを作成します. ここでは $HOME に test.git というディレクトリを作成してみます.

$ mkdir test.git
$ cd test.git
$ git init --bare --shared=true

一行目で test.git を作成,二行目でそのディレクトリに移動しているのはまぁ,よいでしょう. で,三行目で該当のディレクトリを共有レポジトリに変更しています.

注釈

git のオプションについて

ここでは –bare, –shared=true というオプションをつけています. –bare オプションは,このディレクトリには管理ファイルのみが存在するという宣言で このディレクトリに管理をしたいファイルを直接おくことは ** ありません ** . git をローカルのみで使用する場合には不要なオプションです.

で一旦ローカルに戻ってコマンドを打ちます. 一般的には ssh で接続していると思うので通信プロトコルには ssh を使用すればいいでしょう.

$ git clone ssh://path/to/your/server/home/your/account/test.git/

上記のコマンドを打つと(パス周りは適宜修正してください)ローカルディレクトリに先ほど,サーバーで作成した test ディレクトリが作成されます.

  • ここで .git の部分は共有レポジトリであることを明記するための命名規則とでも思っておいてください
    • 別になくても動作します.

注釈

ssh の認証に関して

お使いの環境によっては git が ssh の認証を解決できない場合があります. このような場合, .ssh/comfig を修正することになります.

後はこの test ディレクトリに移動して何か適当なものを作成します. んで,管理を行うファイルを指定していきます.

$ git add .
$ git commit -m 'なんか作った'
$ git push origin master

ここで3つのコマンドを紹介しておきます(今回は単一ユーザーが複数のPCでごりょごりょする場合を前提にしているので). まず,ひとつ目のコマンドでは,今いるディレクトリ以下のすべてのファイル, ディレクトリの変更を履歴として保存します. 2つ目は,具体的に何を変更したのかのメモを書いていると思ってください(これは必須です). で 3 つ目で更新をサーバーの共有レポジトリに渡しています.

注釈

dropbox より面倒??

あまりプログラミング畑にいない人間に git を伝えると, ここで面倒とか言われます. 確かに彼らにとっての目的の大半はファイル共有なわけで, 勝手に同期をとる dropbox のようなものは便利なのでしょうね. ただし,我々プログラマーはこの面倒くささを重視します. なぜなら,勝手なタイミングで勝手に何か作業をされるのが嫌だからです.

例えば,職場で何かコードを書いていたとして,自宅で実行して見たとします. すると,うまく動かない.昨日まで動いていたのに,どこいじったんだっけ ピギャーとか,中途半端な部分で同期されちまったぜ,ギャースとか嫌なんです. そういう意味で明示的にいつ,同期を行うのか決められるのは重要ですし, どのファイルかは指定したい時もありますし,何をやったのかメモは残しておきたいわけです.