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