「モブプログラミング」を採用すると「全員で同じタスクに取り組む (WIP 1)」ため,複雑な Git ブランチ戦略は必要なくなる.例えば master ブランチと develop ブランチだけで運用することもできる.今回紹介する mob コマンドを使うと,モブセッションで繰り返し行なう「ドライバー(タイピスト)交代」をシュッと実現できる.特に「リモートモブプログラミング」だと GitHub に git push をしてドライバーを交代する(Git Handover と言う)ため,mob コマンドを使うと便利!
インストール
mob コマンドは brew コマンドで簡単にインストールできる.そこそこ頻繁にリリースされているため,定期的に brew upgrade をしておくと良さそう.今回の記事を書いてる間にも v0.0.13 ➔ v0.0.17 にバージョンアップしていた.
$ brew install remotemobprogramming/brew/mob $ mob version v0.0.13 $ brew upgrade remotemobprogramming/brew/mob $ mob version v0.0.17
なお mob コマンドは GitHub で OSS になっている.Go で実装されている!
mob : 基本コマンド
基本的に以下の「基本コマンド 3個」を使えば OK!簡単にワークフローを図解した(GitHub は例として).
mob start... 「モブセッション」を開始するmob next... 次のドライバーに Git Handover をするmob done... 「モブセッション」を終了する

1. mob start
「モブセッション」を開始するときに mob start を実行する.Git リポジトリに remote 設定をしておく必要があるため,リポジトリを clone しておく.mob start を実行すると,自動的に mob-session ブランチが作られて git push まで実行される.
(master) $ mob start ✓ git fetch --prune ✓ git pull --ff-only > create mob-session from master ✓ git checkout master ✓ git merge origin/master --ff-only ✓ git branch mob-session ✓ git checkout mob-session ✓ git push --no-verify --set-upstream origin mob-session > you are mob programming (mob-session) $
2. mob next
開発を進めて,ドライバーを交代するときに mob next を実行する.すると,自動的に git add と git commit と git push が実行される.コミットメッセージはデフォルトだと mob next [ci-skip] となる.最後に master ブランチに切り替わる.
(mob-session) $ mob next ✓ git add --all ✓ git commit --message "mob next [ci-skip]" --no-verify ✓ git push --no-verify origin mob-session ✓ git checkout master (master) $
3. mob start
ドライバーを交代したら,もう1度 mob start を実行する.すると,自動的に mob-session ブランチに切り替わり,開発を進められる.モブセッションでは,基本的に mob start と mob next を繰り返す.
(master) $ mob start 10 ✓ git fetch --prune ✓ git pull --ff-only > rejoining mob session ✓ git branch -D mob-session ✓ git checkout mob-session ✓ git branch --set-upstream-to=origin/mob-session mob-session ✓ 10 minutes timer started (finishes at approx. 11:00) > you are mob programming xxxxxxx 5 minutes ago <kakakakakku> (mob-session) $
なお mob start 10 のように引数 minutes を指定すると,自動的にタイマーが起動する.指定した時間が経過すると,Mac の場合は AppleScript (osascript) を使って通知されるようになっている.さらに say コマンドを使って mob next と読み上げてくれる.例えば Mobster など,モブプログラミングに特化したタイマーアプリを使うこともできるけど,mob コマンドに同梱されているのは便利だと思う.

4. mob done
「モブセッション」を終了するときに mob done を実行する.挙動としては mob-session ブランチを git push をして,さらに master ブランチに git merge までしてくれる.最後に 👉 git commit -m 'describe the changes' と表示されている通り,最終的な git commit はドライバーが行なう.個人的に使うなら mob done は使わずにプルリクエストを作る運用にするかなぁー.
(mob-session) $ mob done ✓ git fetch origin --prune ✓ git add --all ✓ git commit --message "mob next [ci-skip]" --no-verify ✓ git push --no-verify origin mob-session ✓ git checkout master ✓ git merge origin/master --ff-only ✓ git merge --squash --ff mob-session ✓ git branch -D mob-session ✓ git push --no-verify origin --delete mob-session 👉 git commit -m 'describe the changes' (master) $ git commit -m'Well done 👍' (master) $ git push
Tips 1 : 環境変数を使う
mob config を実行すると,mob コマンドの挙動を決めている環境変数の値を確認できる.
$ mob config MOB_BASE_BRANCH=master MOB_WIP_BRANCH=mob-session MOB_REMOTE_NAME=origin MOB_WIP_COMMIT_MESSAGE=mob next [ci-skip] MOB_VOICE_COMMAND=say MOB_NEXT_STAY=false MOB_START_INCLUDE_UNCOMMITTED_CHANGES=false MOB_DEBUG=false
export で上書きできるため,例えば MOB_WIP_BRANCH を設定すれば mob-session 以外のブランチ名も使える.MOB_WIP_COMMIT_MESSAGE を設定すれば mob next [ci-skip] 以外のコミットメッセージも使える. direnv などを使って全員同じ環境変数を export できるようにしておくと良さそう.
$ export MOB_WIP_BRANCH=wip $ export MOB_WIP_COMMIT_MESSAGE=mob next (master) $ mob start overriding MOB_WIP_BRANCH=wip overriding MOB_WIP_COMMIT_MESSAGE=mob ✓ git fetch --prune ✓ git pull --ff-only > create wip from master ✓ git checkout master ✓ git merge origin/master --ff-only ✓ git branch wip ✓ git checkout wip ✓ git push --no-verify --set-upstream origin wip > you are mob programming (wip) $
Tips 2 : Zoom で画面共有をする
mob share もしくは mob start 10 share のように share を付けると,Zoom で画面共有を設定するダイアログを表示できる.
$ mob share $ mob start 10 share

なお share を使う場合は Zoom で「画面共有を開始/停止 (Shift + Command + S)」の「グローバルショートカット」を有効化しておく.

とは言え,今回使った mob コマンド v0.0.17 は share に対応しているけど,次にリリースされる v0.0.18 では mob share は削除されてしまう.そして mob start 10 share も DEPRECATED になり,将来的に削除されてしまう.実際に使う場面はなさそう.詳しくは GitHub の Releases を見てもらえればと!
まとめ
mob コマンドを使うと Git Handover をシュッと実現できる.特に「リモートモブプログラミング」をするときに便利!
関連記事
慣れた開発環境を使うことを優先し,個人的に Git Handover はリモートモブプログラミングじゃなくても使っていた.詳しくは2年前に公開した資料に載せてある.合わせて読んでもらえると良さそう!
