モノノフ日記

普通の日記です

知らないと損をするgit

タイトルはホッテントリメーカーから。
明日のgit勉強会に知識ゼロで行くのはまずいと思って触り始めてみました。

基本知識

かWiki - Git/分散レポジトリって何が嬉しいのがわかりやすかった。
Subversionでいう、svkのことみたい。

インストール

手元にあるCentOS5.2で進めていくことにしてみた。普通にyumを叩いてみる。

$ sudo yum install git
Parsing package install arguments
Requested dep: git is provided by installed package
Nothing to do

予想通り無いですね。じゃ、Dagレポジトリを覗いてみる。

$ sudo yum --enablerepos=dag install git

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Updating:
 subversion              i386       1.5.2-0.1.el5.rf  dag               5.4 M
Installing for dependencies:
 git                     i386       1.5.2.1-1.el5.rf  dag                27 M
 perl-Compress-Zlib      i386       1.42-1.fc6       base               52 k
 perl-DBI                i386       1.605-1.el5.rf   dag               864 k
 perl-Error              noarch     0.17014-1.el5.rf  dag                26 k
 perl-Git                i386       1.5.2.1-1.el5.rf  dag                18 k
 perl-HTML-Parser        i386       3.56-1.el5.rf    dag               146 k
 perl-HTML-Tagset        noarch     3.20-1.el5.rf    dag                14 k
 perl-Net-Daemon         noarch     0.43-1.el5.rf    dag                44 k
 perl-PlRPC              noarch     0.2020-1.el5.rf  dag                33 k
 perl-libwww-perl        noarch     5.805-1.1.1      base              376 k
 subversion-perl         i386       1.5.2-0.1.el5.rf  dag               2.1 M
Updating for dependencies:
 subversion-devel        i386       1.5.2-0.1.el5.rf  dag               241 k

うお、なんか依存性パッケージがいっぱい。perlのモジュールが必要なのかぁ。
とりあえず全部インストール。Subversionのアップデートもついでに出来たといい方向に考える。

バージョンの確認

$ git --version
git version 1.5.2.1

gitの公式ページ見ると、最新版は1.6.0.2らしいけど試せればいいので気にしない。

基本操作

を参考に進めます。
新しくリポジトリ作ってプロジェクト追加するところまで進めてみます。

マニュアル表示
$ man gif-diff
No manual entry for git-diff

・・・見つからないしorz
とりあえず--helpオプションでコマンド一覧は見れた。

git --help
名前とメアドの登録
$ git config --global user.name "Tomohiro MITSUMUNE"
$ git config --global user.email "tmitsumune(at)gmail.com"
リポジトリ作成→追加

追加するプロジェクトはsymfonyのsf-sandboxを利用。Download - Symfony

$ wget http://www.symfony-project.org/get/sf_sandbox_1_1.tgz
$ tar xzf sf_sandbox_1_1.tgz
$ cd sf_sandbox
$ git init
Initialized empty Git repository in .git/

これで作業ディレクトリの初期化は完了。簡単。.gitディレクトリが作られてます。

$ ls .git
HEAD  branches/  config  description  hooks/  info/  objects/  refs/

スナップショットの取得

$ git add .

確認メッセージは何も出ないらしい。次にコミット。

$ git commit -m "initial import"

Subversionだと1度リポジトリにaddしたファイルはそれ以降commitするだけでOKだったけど
gitは毎回add→commitする必要があるみたい。それを一括で行えるのが-aオプション。*1

$ git commit -a
ブランチ管理

分散バージョン管理システムはこれが売りなんだろうと思う。
ローカルでブランチ切っていって、オレオレバージョンで管理していくイメージ。

ブランチの作成・確認

$ git branch experimental
$ git branch
  experimental
* master

experimentalブランチに切り替え

$ git checkout experimental
Switched to branch "experimental"

切り替えたブランチにファイル追加

$ echo "test2" > test2.txt
$ git add test2.txt
$ git commit -a -m "branch test"
Created commit 0f8ca38: branch test
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 test2.txt
$ ls
LICENSE  apps/   config/  doc/  log/      symfony*     test/      test2.txt
README   cache/  data/    lib/  plugins/  symfony.bat  test1.txt  web/

masterブランチに戻ってみる

$ git checkout master
Switched to branch "master"
$ ls
LICENSE  README  apps/  cache/  config/  data/  doc/  lib/  log/  plugins/  symfony*  symfony.bat  test/  test1.txt  web/

ちゃんとブランチ管理されてます。

masterにexperimentalをマージしてみる

$ git merge experimental
Updating 43fd349..0f8ca38

Fast forward
 test2.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 test2.txt
$ ls
LICENSE  apps/   config/  doc/  log/      symfony*     test/      test2.txt
README   cache/  data/    lib/  plugins/  symfony.bat  test1.txt  web/

これで両ブランチは同じになりました。
いらなくなったexperimentalブランチを消してみる

$ git branch -d experimental
Deleted branch experimental.
$ git branch
* master

とりあえずここまで。そんなにSubversionと使い勝手は変わらない印象です。

*1:ただし新規ファイルは明示的にaddする必要あり