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は高速で内容がシンプル
  • MercurialWindowsサポートが強い
  • 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. チートシートを編集*1
  2. git fetchでorigin/masterの最新情報を取得
  3. すでに更新されていれば、git rebaseで変更を取り込み
  4. コンフリクトが起こった場合は、コンフリクトを解消し、git addしてgit rebase --continue
  5. git pushでgithubへアップ
という手順です。
起こったミス
ここでチームで編集した際に起こったミス(良い経験)を上げておきます。
  • コンフリクトの解消時、コンフリクトした他の方変更を確認せずに感覚で修正し、失敗*2
  • コンフリクトは起きなかったが、オートコミットの範囲で他の方の変更を復元した
  • 間違いでは無いのですが、rebaseによる綺麗なコミット連携を心がけていたときに、マージしてしまう
  • しかしこの後圧巻の修復っぷりでした!
こんなミスが出ました。これはこの機会にやっておくべき事で、来るべき仕事で使う機会には気をつけることができます。やっててよかったSCMBootCamp!!
@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本道でしたよ^^

感想

いや〜本当に行ってよかった。仕事でチーム開発に使う前に経験できて本当に良かった。生きた経験ができました。主催の@kyon_mmさん、@pocketberserkerさん、講師の方々に感謝です。ありがとうございます。

ゴミについて

昨日行われた「継続的デリバリー読書会に続いて、今日のSCMBootCampでも、皆で食べたおやつのゴミを持って帰りました。このような仕事は開催してくださっている主催者に全部やらせるのは忍びないし、遠方から来ておみやげ買ってきてくださった方達に持って帰ってもらうわけにもいかない。こういうときは今回の僕みたいな、地元から来て何も役割無くて、しかも懇親会行かない人が持って帰るといいなぁと思っています。今後もこういう機会があれば、役割を買って出たいと思います。基本は有志であつまっている勉強会ですからね^^

参考

@shinyaa31さんのツイッターのまとめ

*1:私はここで一旦ブランチにしてから作業しました

*2:私がやりました^^;

*3:@kei10inさんのおかげ