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
- 4つのオブジェクト
- 1ファイル 1 blog
- zlib で圧縮
- 圧縮前の SHA1 ハッシュで管理
- 1コミット毎に新たな commit オブジェクトが生成される
- その生成された commit オブジェクトに HEAD が移る
- ファイルが追加される -> tree オブジェクトの内容が変わる -> ハッシュが変わる
- git-cat-file
- 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
- checkout 元を更新するイメージ
- 開発の目的によっても違う
- 開発が 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
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
コンフリクト時のリカバリ
よく使う小ネタ集
- コミットログに 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 (ワーキングコピーの再構築)
質問コーナー
- 特定のブランチを clone するには?
- clone ではできない.
- capistrano では :branch に "origin/rel_1_4_0" とか指定する.
- clone ではできない.
岩松さんを囲む会
- 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
- Try