ちなみに

火曜日の空は僕を押しつぶした。

Git入門(たぐとかぶらんち編)

今回はタグやブランチについて書きます。

タグをつける

タグは名前みたいなもののことです。正確には現在の状態へオブジェクトへの参照(ref)を指します。タグをつけることによってSHA1ハッシュよりかはわかりやすい名前でコミットを指定するとが可能になります。タグ関連の操作には'git tag'を用います。

$ git tag Initial db58434
$ git tag -l
Initial

一番初めのコミットに'Initial'というタグをつけました。'-l'オプションをつけるとタグの一覧が表示されます。
これでいちいち'db58434'などど打たなくても'Initial'で最初のコミットを指定することが可能とないました。

$ git diff Initial..HEAD
(ページャが起動して)
diff --git a/greet.rb b/greet.rb
index 5f73eff..933f909 100644
--- a/greet.rb
+++ b/greet.rb
@@ -1,2 +1,2 @@
 
-puts 'Hi, git!'
+puts 'Hello, git!'

このようにして'Initial'から'HEAD'までの差分を簡単に取り出せます。*1

ブランチを作る

ブランチと言うのはプロジェクトの枝のことだと思えばわかりやすいかと思います。ある拡張をしたときとしない時を別のブランチに別けてそれぞれ開発したり、安定ブランチと開発ブランチを別けて安定ブランチではバグ取りに専念しながら、開発ブランチではがんがん改良を加えるいうことが可能になります。当然2つのブランチのマージや、特定のコミットの取り込みも可能です。

では実際にブランチを作ってみましょう。

$ git branch class
$ git branch
  class
* master

ここでは'class'というブランチを作りました。'master'と言うのはプロジェクトを作った時に自動的に作られるデフォルトのブランチです。'git branch'に名前を指定すると現在のブランチの履歴点を起点にブランチを作ります。指定しなければブランチ一覧を表示します。削除する時は'git branch -d [ブランチの名前]'とします。
次に現在のブランチを'class'に変更します。

$ git checkout class
Switched to branch "class"
$ git branch
* class
  master

これで'*'の意味が分かりましたね。現在のブランチが'*'付きで表示されます。
このブランチ内で作業していきます。今回はブランチの扱いが目的なので細かい内容は省きます。

$ git branch
* class
  master
$ git log HEAD^^..HEAD
commit 3ddbe2a7636207a6b81b799da21e60e0fb8d30d1
Author: Tomohiro Nishimura <tomohiro68@gmail.com>
Date:   Thu May 15 02:00:08 2008 +0900

    ディレクトリ構成をlib/ spec/に別けて、テストを書いた

commit 7393adc5bc6df6f3903c512b3687cd9818d68418
Author: Tomohiro Nishimura <tomohiro68@gmail.com>
Date:   Wed May 14 23:52:34 2008 +0900

    クラスの導入
$ ls
lib/ spec/

ブランチを切り替えてみます。

$ git checkout master
Switched to branch "master"
$ ls
greet.rb

これを見ると分かる様にあるブランチにした変更は別のブランチには無関係です。別々の変更を加えていくことが出来ます。

classブランチの内容をmasterブランチにマージする

classブランチでの開発が進みどうやらこちらの方がうまく動いているみたいなのでmasterブランチにマージしようと思います。
今回はコンフリクトが起きなかったということにしておきます。コンフリクトが起こった時は手動で解決する必要があります。

$ git branch
  class
* master
$ git merge class
Updating ca93e38..3ddbe2a
Fast forward
 greet.rb           |    2 --
 lib/greet.rb       |   14 ++++++++++++++
 spec/greet_spec.rb |   11 +++++++++++
 3 files changed, 25 insertions(+), 2 deletions(-)
 delete mode 100644 greet.rb
 create mode 100644 lib/greet.rb
 create mode 100644 spec/greet_spec.rb
$ ls
lib/ spec/

これでmasterのツリーにclassブランチの内容がマージされました。

これから

バージョン管理システムをちゃんと触るのは始めてなのでまだ手探りですが、かなり便利なもんだと言うことは分かりました。
今後も勉強しつつ有効に活用していきます。まずは研究室用のリポジトリを作りたいけど復数人でのコミットを許可するのに、Linuのユーザとグループの管理がよく分かっていなくて後回しになっています。
僕の様にSubversionCVSが使えなくてもGitは覚えられます。今からバージョン管理システムを覚えようと言う人は、GitかMercurialをやってみると良いと思います。
githubなんかも楽しいのでgitを使い出した人はアカウント取っても損はしないかなと。

それでは皆さん良いGitライフを。

参考資料

Software Design 2008年4月号 第2特集「分散バージョン管理システム Git 徹底活用ガイド」
Git入門 - ドキュメント

*1:'git diff db58434..HEAD'でも同じ