言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

git 勉強中

永らく subversion を便利に使ってきたが、git ブームの波に逆らえなくなってきたので、git についてあれこれ調べている。とりあえずマニュアルを見てみる。

$ man git

で更なるドキュメントの紹介がずらずら出てくる。沢山ありすぎるなー。でもちゃんと普通のマニュアルがあるというのは subversion よりも好感が持てる。subversion の man ページはどうでも良い事しか書いてない。

準備

ローカルで使う

git(1) の指示に従い gittutorial(7) を流し読み。まずはともあれ git config で自分の名前を登録する。これをやると ~/.gitconfig に設定ファイルが作られる。

$ git config --global user.name "名前"
$ git config --global user.email "メール@アドレス"

subversion と違う所は、subvesion は一度登録したファイルは自動的にコミットされるが、git の場合変更したファイルを毎回 svn add で指定するという事らしい。この git add, git ファイルでは無く内容を追いかけるとあるがどういう事だろう。ちょっと実験してみる。

$ mkdir mygit
$ cd mygit
$ echo hello > hello.txt
$ git init
$ git add .
$ git commit -m 'initial check in'
$ git show
commit 276202d009e27789ba962defbc8154301c171bd2
Author: takashi <takashi@scissorhands.local>
Date:   Wed Nov 26 13:25:33 2008 -0800

    second check in

diff --git a/hello.txt b/hello.txt
index ce01362..e019be0 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-hello
+second

つまり、commit した瞬間のファイルではなくて、add した瞬間のファイルが保存されるみたい。subversion に慣れた人は常に git commit -a して自動 add にしておいた方が安全かも知れない。

次に私の苦手なブランチの説明がある。subversion では、ブランチはただのディレクトリで、私はこれが気に入っていたのだが git ではブランチは特別らしい。ブランチのリストと作成は git branch、ブランチの移動は git checkout を使う。

$ git checkout test
$ git branch master * test
$ git checkout test
$ git commit -a 'third commit'

この変更点を最初のブランチ (master) に反映させるには、master に移動してから git merge を行う。一時的に作ったブランチは git branch -d で削除出来る。マージせずに消したいときは -d の代わりに -D を使う。削除してもちゃんとマージされた test 内のログは残る。

$ git checkout master
$ git merge test
$ git branch -d test

最後に gitk を使いカッコイイ(?) GUI でログを確認する。ここまでローカルだけの使い方。レポジトリが要らないので RCS っぽいな。

共有

次に共有方法について。gittutorial(7) には、二つのディレクトリを同期して使う方法が簡単に書いてある。しかし、サーバ上で共有する場合や、ブランチの共有はどうなるのかが分かりにくいので確かめてみる。とりあえず先ほど作った mygit のクローンを作って変更を push してみる。

$ cd ..
$ git clone mygit/ local
$ cd local
$ echo 'fix it' > hello.txt 
$ git commit -a -m 'very nice fix'
$ git push
$ cd ../mygit/
$ git checkout -f
$ cat hello.txt 
fix it

で、ブランチを作る実験をしてみたのだが、どうやら git の場合、ブランチが使えるのはローカルだけで、共有したい時にブランチは使えないようだった。これでは全然使い物にならないな。