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 を使う場合も

###複数のリポジトリがある場合

  • あるリポジトリから自分のリポジトリに pull したい!
% 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 でエラーになる
    • リモートリポジトリのコミットが入れ替わった可能性がある
    • リモートの HEAD のハッシュ値が異なる
    • 追従するだけのリポジトリは remote /fetch
% 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 1025
    • 1.9.1 PR2 1125
    • 1.9.1 1220
    • 仕様が固まらない
    • cgi.rb
    • rdoc
    • M17N
    • miniunit
      • Test::Unit が削除される代わりに実装されるもの
      • Test::Unit は Gem で提供される
    • default_internal
    • File -> external_encoding -> IO -> internal_encoding -> Object
    • external_encoding のデフォルト値は指定できるが,internal_encoding は?
    • そこでいろいろ問題あるらしい

##ふりかえりなど

  • Keep
    • プラズマディスプレイは見やすい
    • CTC様++
    • 招待講演はよかった.岩松さんありがとう.
    • Git++
    • Wikiを早く作った
    • IRC でヒアリングできたのが良かった
  • Problem
    • Rails勉強会なのにRailsの話がない
    • プロジェクタgdgd
  • Try
    • Ruby勉強会の開催
    • 初心者向けがいいかも
    • 枠を設ける(月替わり etc.)
    • Rubyの話でもいいよーとアナウンスする
    • プロジェクタの説明書
    • Wiki が早すぎるとトピック小 -> 歩留まり(参加率)下がる
    • 最新の Web ページを rails-tokyo-latest などにしておく
    • 勉強会の Wiki に IRC の情報を書く
    • Debian 方面への Ruby/Rails の出張講演とか
 
comments powered by Disqus