SCMBootCamp in Nagoya 1 参加してきた
4/22に行われたSCMBootCamp in Nagoya 1に参加してきました。
前々から参加したかった勉強会で、今回は名古屋で開催されるという事で、はりきって行ってきました。結論から先に言うと、参加して本当によかったです。その理由が、「DVCSでチームで管理する際に、起こしがちなミスを経験できた」事、これが非常に大きいですね。とってもいい勉強会でした。私は今回、Gitで受けさせてもらいました。
スケジュール
10:00 - 10:30 受付10:30 開会
10:35 - 11:30 基調講演 @methane
11:30 - 12:00 各DVCS入門セッション
12:00 - 13:20 お昼休み(各自で昼食)
第二部 - 演習
13:20 - 14:35 演習1
14:35 - 14:50 休憩
14:50 - 15:50 演習2
15:50 - 16:15 レビュー + 休憩(運営でスイーツ提供)
16:15 - 17:15 演習3
17:15 - 17:40 レビュー + 休憩
17:40 - 18:10 講演
18:10 - 18:20 KPT
18:20 - 18:30 閉会
懇親会
19:00 - 21:00 同会場にてピザとソフトドリンク
基調講演
@methaneさんによる発表資料「これから分散バージョン管理を始める人たちへ」というタイトルの発表でした。私が理解できた内容は以下のとおりです。
- VCSを利用する際は、それに合わせて業務フローも変えないと効果が薄い。
- Subversionのような集中管理型では特にコードレビューがやりずらかった。
- よくある開発パターン:ブランチが開発ブランチのみ
- Gitは高速で内容がシンプル
- MercurialはWindowsサポートが強い
- BazaarはWindowsサポートが強いかつ、Subversionに似通ったコマンド体系で習得が早い
各DVCS入門セッション @bleisさんによるGitの説明
@bleisさんによる、Gitの基本的な考え方の説明でした。発表資料はGithubに公開されています。リンク先の右のdownloadからzipやtarでダウンロードできます。内容はとても分かりやすかったです。まとめると
- Gitの中身を分類すると、Blob ファイルの中身 Tree ディレクトリ構成 Commit コミット内容になる。
- ハッシュ値を使って、ファイルの比較と、ファイルの存在チェックを行っている。
- Treeの中に、ファイル名を持っている。Treeの中にファイル名のハッシュ値を持っている。逆にBlobの中にハッシュ値がない。
- 親コミットをたどって履歴がわかるようになっている。
- gitのコミットメッセージは、1行目、タイトル、2行目、空白、3行目、詳細。
- gitでファイルを違うディレクトリに移した場合、Treeに変更されるが、Blobは変更されない。
- ブランチはCommitオブジェクトへのポインタ。
- gitでブランチのマージ時には、親コミットがブランチの親とマージ先の親の二つになる。
- mergeは新しいコミットでマージを実現する。rebaseはブランチのマージを一本にする作業。
- git fetch originでクローン元の最新コミットを取得する。
演習
内容
演習は、自分が選んだDVCSのチートシートを、テーブル毎に協力して作成する事になります。私が選んだのはGitなので、Githubを中央リポジトリとして作業する形になりました。同テーブルになったのは、@kei10inさん、@sue445さん、@WK6_8Bさん、@cointoss1973さん。(但し@cointoss1973さんは、途中でMercurial講師として抜けていかれました)そしてテーブルの講師は、@clairvyさん。まず私たちのテーブルでは、@kei10inさんがgithubのSCMBootCampのリポジトリをフォークし、私たちのgithubアカウントを共同開発者の形で登録していただき、スタートしました。そして、githubのissueを使用して、各項目毎にトピックを作成し、その項目をassignする事で担当宣言し、チートシートを作成していきました。
私たちのGithubリポジトリ
Gitによる作業手順
gitによる作業手順は以下のような手順になりました。まず、githubのリポジトリをgit cloneでコピーしてから、- チートシートを編集*1
- git fetchでorigin/masterの最新情報を取得
- すでに更新されていれば、git rebaseで変更を取り込み
- コンフリクトが起こった場合は、コンフリクトを解消し、git addしてgit rebase --continue
- git pushでgithubへアップ
起こったミス
ここでチームで編集した際に起こったミス(良い経験)を上げておきます。- コンフリクトの解消時、コンフリクトした他の方変更を確認せずに感覚で修正し、失敗*2
- コンフリクトは起きなかったが、オートコミットの範囲で他の方の変更を復元した
- 間違いでは無いのですが、rebaseによる綺麗なコミット連携を心がけていたときに、マージしてしまう しかしこの後圧巻の修復っぷりでした!
@clairvyさんに教えていただいたナイスな事
テーブルの講師である@clairvyさんにはいろいろ教えていただきました。rebaseによる各コミットの連結や、ログの確認の仕方などなど。特に参考になったのはコミットの枝分かれがよく分かるgit logの見方です。git log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'
このコマンドを打つとあら不思議、--graphの表示によるコミット系譜に合わせて、色もついてとても分かりやすく表示されるではありませんか!このようなコマンドをエイリアスとして登録して、キー打ちを簡略化する事もお教えいただきました。いやはや、奥が深いですねぇ。
結果
登録された全issueまではいきませんでしたが、楽しくできました。今日のまとめ
最後に、今日のまとめを各テーブル毎に発表し、締めくくりました。他のテーブルの方達のチートシートは、出来がいい!私たちのテーブルは最初からチートシートを作ることが目的ではない!って言いきって、ひたすらGitの興じていたので、デザインとかそっちのけでしたw他のテーブルの皆さんのチートシートは見やすく、工夫もあり、見てておもしろい物でした。ただ、私たちのコミット系譜は一直線できれいでした!*3途中からみんなしっかりrebaseでやりきったため、1本道でしたよ^^