hbstudy#33のMercurialハンズオンに参加してきました

はい、とてつもなく久しぶりのブログです。最近ブログネタになるようなことをほとんどしていませんです。

4/28(土)に開催された hbstudy #33 に参加してきたので、レポート的なものを書いておこうかと思います。

バージョン管理の必要性

  • ファイルの変更の5w1h(いつ、どこで、だれが、何を、なぜ、どうやって)がわかる

バージョン管理が必要なファイル

  • サーバの設定ファイル
  • デプロイスクリプト
  • 環境構築のためのプロビジョニングスクリプト
  • ドキュメント

など編集するものすべて

バージョン管理すると

  • 変更の経緯がわかる
    • セットアップが職人技じゃなくなる
  • どのファイルが変更されたかすぐにわかる
  • .bakとかできなくなる
    • 心の平穏w

インフラ向きのバージョンな管理システムは

  • git
    • [o] 手軽にバージョン管理
    • [o] 他のサーバと履歴を共有
    • [o] チェンジセット
    • [o] ブランチ
    • [x] コマンド体型が他と違う(モヒカン向け)
    • [x] Windowsで使うにはmsysが必要
  • Mercurial
    • [o] 手軽にバージョン管理
    • [o] 他のサーバと履歴を共有
    • [o] チェンジセット
    • [o] ブランチ
    • [o] Windowsサポート
    • [x] githubをサポートしていない

どこででも使えるMercurialいいよ!!
癖も少ないし!

Mercurial

  • Mercurial = 水銀
    • なのでコマンドは hg (元素記号)

分散バージョン管理システム

  • 手軽にバージョン管理
    • あとからサーバを準備して、他サーバとの共有も可
  • ローカルコミット
  • 手軽なブランチングと安全なマージ
    • コミット済みの変更をマージするので安心

特徴

  • gitに比べてシンプル
    • リビジョングラフがすべて
    • 分岐はブランチ
  • エクステンション
    • pythonで拡張可能
    • 便利な機能はエクステンションなので、有効にしないとダメ(同梱されているものもすべて無効化されている)
    • 履歴改変系もエクステンション
  • 安全な履歴管理
    • 履歴は神聖
    • 改変可能かどうかを示す phase という安全弁
    • 危険な履歴改変はエクステンションを有効にする必要あり
      • rebase, transplant, mq

履歴改変

履歴改変はpushしていないもののみ可能
→ push 後は誰が触っているかわからない
  • コミットログをあとから変更
  • コミット忘れの追加など
  • コミットを移動する

用語など

資料を参照

ハンズオン

各自で進めましょう!

  1. 課題のダウンロード
  2. おすすめ.hgrcをベースに.hgrc設定
  3. 基本操作
  4. リポジトリサーバを使う

基本操作

  • Blockdigのリポジトリをcloneして、ログやリビジョングラフを見てみる
    • 深夜2時過ぎにcommitしてる!
  • 課題用ディレクトリでリポジトリを作成
    • hg init
  • 今あるファイルをリポジトリに追加
    • status -> add -> status -> commit -> status
  • 少しずつファイルを変更しながら、コマンドの使い方を覚える
    • 編集 -> diff -> status -> commit
  • (直前の)コミットの取り消し
    • commit -> rollback -> revert
      • 直前以前のコミットを取り消すにはbackuoutを使う
  • マルチプルヘッドを作る
    • prarentsで現在のリビジョンを確認(Nとする)
    • 編集 -> commit -> update N -> 編集 -> commit -> update N -> 編集 -> commit -> glog でリビジョングラフを確認
  • マルチプルヘッドをマージ
    • merge
      • ヘッドが3つ以上ある場合は merge REV のようにリビジョン番号を指定する
    • マージしたらコミット
    • マージツールが起動してしまう場合は update --clean で元に戻して、 merge --tool=internal:merge をする
  • マージの取り消し
    • update --clean

リポジトリサーバを使う

  • 簡易的にサーバを起動
    • リポジトリのあるディレクトリで hg serve
      • 8000ポートでサーバが起動
    • pull, push, cloneを試す

hgrcの内容はこんな感じで

[web]
    allow_push = *
    push_ssl = False
  • コンフリクトさせたり解決したり

このへんで時間切れと相成りました。


講師の troter さんとサポートで来て下さっていた方々、heartbeatsの皆様、お疲れ様でした!
懇親会も含めて、楽しめました。

※相変わらず、まとまりもなく、資料を見れば書いてあることばかりですが、大目に見てください。

Mercurialの名前付きブランチを試してみた

連投ですが、hbstudy #33のMercurialハンズオンで課題として挙がっていた、名前付きブランチを簡単にですが試してみました。
※defaultブランチは、ハンズオンの中で使っていたものをそのまま使っています。

名前付きブランチを作る

$ hg branch test_named_branch

適当にファイルを更新してコミット

$ vi glossary.rst
$ hg commit -m "modified glossary.rst"

リポジトリサーバにpush ※新しく作ったブランチをpushするときは --new-branch が必要

$ hg push http://localhost:8000 --new-branch

再び適当に編集してコミット

$ vi glossary.rst
$ hg commit -m "add contents to glossary.rst"

defaultブランチとコンフリクトするように編集してコミット

$ vi remote.rst
$ hg commit -m "modified remote.rst"

変更内容をpush

$ hg push http://localhost:8000/ 

defaultブランチに切り替え

$ hg update default

変更内容をpull ※updateをしても特にファイルに変更は生じない

$ hg pull http://localhost:8000
$ hg update

ブランチの内容をマージ

$ hg merge test_named_branch

コンフリクト内容を解決

$ hg resolve --list
$ vi remote.rst
$ hg resolme --mark remote.rst

マージした内容でリポジトリサーバにpush

$ hg commit -m "merged test_named_btanch to default branch."
$ hg push http://localhost:8000/

こんな感じで簡単にブランチ作成やブランチでの変更作業、切り替え、マージなどができました。
うん、簡単。