git勉強会に参加
先週の土曜に開催されたgit勉強会に参加してきました。*1
今回の講演者はなんとgitメンテナの浜野さん。
講演資料も既にアップされてます。http://userweb.kernel.org/~junio/200810-tut.pdf
追記
動画も公開されてました。http://pneskin2.nekoget.com/press/?p=146
参加する前はメンテナの人の話なので難しい内容になるのかなと危惧してましたが、資料のタイトル「Introduction to git」からわかるようにgitの基本的な仕組みや考え方などのお話だったので非常に参考になりました。Subversionとの違いがなんとなく理解できたのが収穫。あとこんなコマンド別の機能紹介も面白かった。git stashやrebaseは便利そう。
既にまとめられてる人もいるようなので話を聞いて思ったことをメモっておきます。
分散管理システム
ステージングエリア(Index)という概念
- gitにはHEADリビジョンとWorking Copy(WP)との間にIndexというバッファのようなレイヤがある
- ファイルのコミットはWPからIndexへ、IndexからHEADへという流れ
- WPでテスト用のパッチやデバッグ用のコードやごちゃごちゃと作業する
- IndexはWPで行った作業を区切りのいいポイントでコミットするもの(チェックポイントみたいなもの)
- 実装が終わったら、Indexに行ったコミットをHEADにコミットする
Branch
- Subversionはバージョン番号で管理するイメージだが、gitはブランチ単位で管理するイメージ
- Indexの仕組みから推察するに、バージョンナンバリングで管理するのはナンセンスな気がする
複数による開発体制
- Subversionみたいに1つ共通リポジトリを用意して、みんなでそれを共有するやり方
- 各個人ごとにパブリックな公開リポジトリを用意して、必要な人だけがそこにfetchするやり方
- Linux kernel開発は主にこっちのやり方らしい
- 規模が巨大で全てを把握する必要がないからなのかな?
便利なコマンド
git stash (資料p.27〜p.36)
- 作業途中の状態をテンポラリにセーブして、現在のHEADの状態に戻せる
- その後HEADに加えた変更と、テンポラリにセーブした状態とのマージをちゃんと取れる
- git stash --keep-indexとするとIndexはセーブした状態を維持したまま、テンポラリにセーブ
- テストコードだけ削ってコミットしたいときとかに便利
git rebase (資料p.37〜38)
- 過去のコミットと最新コミットを組み合わせて、過去にコミットしたことにできる
- 文章にすると難しいので資料の図がわかりやすい
git blame (資料p.71〜74)
- gitのblameはファイル位置が変わってたり、複数のファイルから1つのファイルを構成したりしてもblameする
- 計算コストが高いのでオプション指定して実行(-M, -Cオプション)
Q&A
- 各ブランチ間、バージョン間でファイルはどのように保持されてる?
- 差分だけ持つようになってる
- packfileという仕組み?
- 圧縮率が異様に高い
- OpenOfficeのファイルは保存すると最初からzip圧縮されてる
- なのでunzipしてからgitに入れると高い圧縮率で管理されるらしい
- 差分だけ持つようになってる
- プロトコルがいっぱいあるけど、どれがよい?
- gitプロトコル推奨
- 理由は最適化されるから
- httpプロトコルは逆引きで1つずつ比較するのでレイテンシが大きいから非効率
- httpプロトコルのメンテナがノンアクティブなので開発が進んでない、とか言ってた気がする