Mercurialを使った俺々バージョン管理ノウハウまとめ(2009年夏編)

職場でMercurialを使っていい感じに俺々バージョン管理を
やれるようになってきた感があるので、
ノウハウをまとめる。

概略

  • 中央リポジトリと同期をとるbranchを用意する
    • 同期branchはsync_cvsとかそんな名前
    • defaultをそのまま使っても良い
    • このbranchで開発作業は絶対にしない
  • 全ソースをhgで管理しない
    • 中央リポジトリで管理しているソースの数が多い場合の話
      • hgで管理するファイル数が多いとhg update等が遅くなり、開発のスピード感が落ちる
  • ticket毎に開発作業用branchを作成する
    • 同期branchから作成する
    • 同期branchから随時rebaseする
    • 必ず、同期branchの最新版からrebaseした状態でテストを行う。
    • テストが通ったらticket別branchから同期branchにmergeする。その後、同期branchの内容で中央リポジトリにcommitする。
      • 同期branchにmerge後、ticket別branchはinactiveなbranchになる
  • 必要に応じて調査用branchを作成する
    • 絶対にどのbranchにもmergeしない
    • 使える成果はticket別branchにつまみ食いする
    • 使い終わったらclose

ポイント解説

ticket毎に開発作業用branchを作成

この運用により、複数ticketの作業を並行して行うときに成果が混ざらない。
中央リポジトリにcommitするときも混ざらない。
俺々管理から、ファイルサーバ等経由でチーム内でリポジトリを共有する
我々我々管理に移行してもそれほど問題が起こらない。

ticket別branchを同期branchから随時rebase

hg rebaseはちょっと試してみた感じでは微妙なので使わない。
同期branchからmergeする。
ticket別branchにて「hg merge 同期branch」などとする。


同期branchのheadからmergeしたとする。
またはmerge済みの状態から何度かcommitしてticket別branchをのばしたとする。
その時のticket別branchのheadと、
反対方向へのmerge、つまり同期branchにて「hg merge ticket別branch」を
してできたheadは同一の内容である。


つまり、ticket別branchで動かしている時はちゃんとしていたが
同期branchにmergeしたらおかしくなった、といったことは起こりえない。

全ソースをhgで管理しない

ticket別branchで触らなければいけないソースが増えたら、
同期branchでaddして、ticket別branchをrebaseする。

調査用branch

どうせどこにもmergeしないのでlog出力だろうが
何だろうが自重せずにポコじゃか入れていく。
ただし、log出力等とお試し実装は必ず別々にcommitし、
別のchnagesetになるようにする。
理由は次のつまみ食いを参照のこと。

つまみ食い

お試し実装の中で使いたいものをつまみ食いする。
MercurialにはGitのようなつまみ食いmerge機能はない
ーGitのつまみ食いmergeをこういった用途に使えるのかは知らないー
ので、hg exportでのpatch作成とhg importでのpatch適用でつまみ食いをする。


採用したいchangesetのrevisionを指定してhg exportコマンドを実行し、
patchをポコポコ作っていく。
TortoiseHGを使っているなら、changelogからrevisionを選択して、
右クリックメニューからpatch作成を選べるのでそれを使うとよい。


ticket別branchにupdateして、先ほどのpatchファイルを順繰りにhg importで適用していく。
変更業の前後の内容さえ同じなら行番号がずれていてもpatchをあてられるので、
log出力等を入れたコードから作成したpatchでも概ねちゃんとあたる。
また、複数のpatchを1changesetとしてcommitしたい場合は、
hg -f --no-commit のoptionをつけるとよい。