Rails' Wiki - Rails勉強会@東京第33回に参加してきた.

ここ最近の9月としては結構冷え込む中,30人ぐらいが Git のために集まりました.Git すごいよ,Git.

  • 午前中は Git のお話
  • 午後はそのとき決めることに

まとめと感想

  • はてブのタグ
    • RailsMeetingTokyo
  • ぎっとであってじっとではない.
  • いろんな使い方があるけど,やっぱ基本はあると言うことがわかった.
  • 専門家(?)を呼んでの講演は非常に良かった.こういう異文化交流っていいよね.

分散ソースコード管理システム Git

  • 岩松さん@Debian JP Project の中の人
  • もともと OSC Sapporo で高橋会長が依頼したようだ
はじめに
  • Git は「じっと」じゃなくて「ぎっと」
  • 使い方は人によってそれぞれ異なる
  • 朝起きてまずすることは -> リポジトリのチェック
Git のデータモデルや考え方
  • 4つの階層
    • Working Copy
    • index
    • Local Repos
    • Remote Repos
  • Git のコマンド
    • plumbing(git-xxx)コマンド(下位 メンテナ向け)
    • porcelanin(git xxx)コマンド(上位 一般ユーザ向け)
  • Git のオブジェクトファイル
    • 4つのオブジェクト
      • commits
      • trees
      • blobls
      • tags
    • commit > tree > blob
  • 1ファイル 1 blog
    • zlib で圧縮
    • 圧縮前の SHA1 ハッシュで管理
  • 1コミット毎に新たな commit オブジェクトが生成される
    • その生成された commit オブジェクトに HEAD が移る
  • ファイルが追加される -> tree オブジェクトの内容が変わる -> ハッシュが変わる
  • git-cat-file
    • -t SHA1-Hash でそのオブジェクトが何かを見る
    • -p SHA1-Hash で内容を表示
      • commit オブジェクトだと,前の commit が parent として表示される
  • tree はファイルツリー状態のオブジェクトで,commit は各 tree の前後関係を記録するオブジェクト
  • tag オブジェクトは PGP 署名時のみ作成される
    • tag オブジェクトは 指定した時点での commit オブジェクトに名前をつけるようなもの
  • Pack ってなに?
    • オブジェクトを DB 化したもの
    • git gc コマンドで pack される
ブランチの使い方
  • git branch
    • 作成・削除・リネーム
  • git checkout
    • 切替・ファイルチェックアウト
  • git rebase
    • ブランチをリベース
  • git merge
    • ブランチ間のマージ
  • ブランチを使った例(1)
% git checkout -b test
開発
% git checkout master
% git merge test
  • ブランチを使った例(2)
% git clone git://xxxx/
% git checkout -b devel
開発
% git checkout master
% git pull ( remote から取得 )
% git checkout devel
% git merge master ( local master からマージ -> 親コミットが 2 つできる )
    • 複数の親コミットができる
      • 開発環境によっては必要のないもの
    • devel ブランチ上で git pull origin master でも OK
  • ブランチを使った例(2)
    • rebase を使う
    • 途中まで (2) と同じ
% git rebase master
    • checkout 元を更新するイメージ
      • 自分の commit を checkout 元のさらに上にのせるような感じ
    • git pull --rebase origin master
  • 開発の目的によっても違う
    • 開発が fork -> merge 主体でも OK
    • マージ元が1つである -> rebase 主体
    • ブランチ上でどう作業するかがポイント
  • ブランチ作るとき
    • 新規機能用
    • パッチ維持のために
    • パッチお試し用
      • git stash を使う場合も
複数のリポジトリがある場合
% git pull git://XXXX/ master
  • 毎日100個のリポジトリから pull したい!
  • git remote 使いましょう
% git remote add REMOTE_NAME Repos-URL
  • origin は pull したときに生成される REMOTE_NAME
% git clone git://XXXX/YYYY.git
% cd YYYY
% git remote add ZZZZ git://XXXX/PPPP.git
% git remote update
  • git remote update
    • origin -> REMOTE_NAME... とアップデート(pull)される
  • リモートリポジトリをグループ化できる
    • git config remotes.everyday origin など
  • checkout --track
    • リモートリポジトリのブランチをローカルブランチにする
branch/remote 間のコード参照
  • 他のブランチのコードを参照するには
% git branch
* master
  testing
% git show testing:src/info.rb
  • ログを確認する
% git log testing
% git whatchanged testing
  • 差分を見る
% git testing..master src/info.rb
  • 異なる差分を見る
% git testing...master
コンフリクト時のリカバリ
  • 対策はとれるが,コンフリクトは発生する
    • rebase で最新コミットは常に上に持ってくる
    • 独自パッチは持たない
  • どうすればいいのか?
    • git merge 時のリカバリ
      • 手動マージ -> 動作確認 -> add -> commit
    • git rebase 時のリカバリ
      • 手動マージ -> add -> git rebase --continue
    • git pull 時のリカバリ
      • メンテナの場合 -> 一蹴
      • ユーザの場合 -> 手動マージ -> add -> commit
    • git-am 時のリカバリ ( apply mail = メールで送られるパッチの適用 )
      • メンテナの場合 -> 一蹴
      • ユーザの場合 -> 手動マージ -> add -> git-am --resolved
  • コンフリクト時のリカバリ
    • コンフリクトは発生する
    • 発生しないようにリポジトリを管理する
      • pull 時に問題が発生しない環境作り
      • git submodule を使った機能分け
      • マージは極力避ける
よく使う小ネタ集
  • コミットログに typo
    • 最新のコミットに対して変更加えるオプション(--amend)
% git commit --amend
    • 最新のコミットに README をコミットする
% git commit --amend README
    • いらないファイル moge をコミットしてしまった
% git reset HEAD^ moge
  • ディレクトリを扱う良い方法
    • .gitignore ファイルを設置する
  • 何もいじってないのに pull でエラーになる
% git fetch origin (オブジェクトを全て取得する)
% git ls-remote origin HEAD (HEAD のハッシュ値を取得)
% vim .git/refs/heads/master (HEAD のハッシュ値を書き換え)
% git checkout -f (ワーキングコピーの再構築)
      • 最新のソースコードを取得するだけの場合は fetch する
        • fetch はオブジェクトを取得するだけ
        • pull はソースコードをワーキングコピーに展開する
質問コーナー
  • 特定のブランチを clone するには?
    • clone ではできない.
      • capistrano では :branch に "origin/rel_1_4_0" とか指定する.

岩松さんを囲む会

  • HTTP 経由は使わない方が良い
    • 推奨は Git protocol
    • キャッシュの問題?
  • 複数人でプロジェクトを回す良い方法は
    • セントラルなリポジトリを持って,メンテナが管理するのが良いかもしれない
  • 社内で Git を使うには
    • git init でここに push など
    • pull するには git-daemon を立てる
      • ただし pull できるよフラグを立てる必要がある
  • 違うブランチの Working Copy を見たい・使いたい時
    • git-archive で tar -> 展開テスト
    • export があればいいのになぁ
  • svn で言う external は?
    • git submodule
  • git-stash とは
    • 編集中の内容をどこかに一時的に保存するコマンド
    • 当然,コンフリクトも起こる
  • git bisect
    • バグの2分岐検索
  • git をバックエンドにした wiki
    • git をデータベース的に使ってみる試み
  • Git 勉強会やりたい@岩松さん

LT

  • Ruby 1.9.0_5 を偲ぶ @Yuguiさん
    • 1.9.1 PR1 10/25
    • 1.9.1 PR2 11/25
    • 1.9.1 12/20
    • 仕様が固まらない
      • cgi.rb
      • rdoc
      • M17N
      • miniunit
        • Test::Unit が削除される代わりに実装されるもの
        • Test::Unit は Gem で提供される
    • default_internal
      • File -> external_encoding -> IO -> internal_encoding -> Object
      • external_encoding のデフォルト値は指定できるが,internal_encoding は?
      • そこでいろいろ問題あるらしい

ふりかえりなど

  • Keep
  • Problem
    • Rails勉強会なのにRailsの話がない
    • プロジェクタgdgd
  • Try
    • Ruby勉強会の開催
      • 初心者向けがいいかも
    • 枠を設ける(月替わり etc.)
    • Rubyの話でもいいよーとアナウンスする
    • プロジェクタの説明書
    • Wiki が早すぎるとトピック小 -> 歩留まり(参加率)下がる
    • 最新の Web ページを rails-tokyo-latest などにしておく
    • 勉強会の WikiIRC の情報を書く
    • Debian 方面への Ruby/Rails の出張講演とか