読者です 読者をやめる 読者になる 読者になる

モノノフ日記

普通の日記です

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は便利そう。

既にまとめられてる人もいるようなので話を聞いて思ったことをメモっておきます。

分散管理システム

  • cloneすると、各個人の手元にプロジェクトが丸ごとやってくる
  • 手元のリポジトリに対してコミット、最終的に他人とマージ
  • 自分の手元でコミットできるということ=自分だけの作業記録がつけれる
    • svnのようなシステムではコミット権が無い人は作業記録がつかない(つけれない)
  • 複数に枝分かれしたBranchをMergeする処理が重要になるので使う側にもスキルを要求する仕様なのかも
    • 全体を取りまとめるcontributorが必要不可欠と思う

ステージングエリア(Index)という概念

  • gitにはHEADリビジョンとWorking Copy(WP)との間にIndexというバッファのようなレイヤがある
  • ファイルのコミットはWPからIndexへ、IndexからHEADへという流れ
    • WPでテスト用のパッチやデバッグ用のコードやごちゃごちゃと作業する
    • IndexはWPで行った作業を区切りのいいポイントでコミットするもの(チェックポイントみたいなもの)
    • 実装が終わったら、Indexに行ったコミットをHEADにコミットする
そうすると
  • 外から見える分にはtypoやその他の失敗、またごちゃごちゃしたテストコードなど経た過程は全く見えず完璧にきれいなコミットが行われてように見える
  • 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プロトコルのメンテナがノンアクティブなので開発が進んでない、とか言ってた気がする

*1:会場の椅子がコンテッサでびびった