Smooth git handover with mob

mob Logo

Test Workflow Contributors Downloads Downloads of latest Version Stars

Smooth git handover with ‘mob’.

What people say about ‘mob’

“Mob has allowed us to run fast-paced, engaging, and effective sessions by enabling sub-10-second handover times and otherwise getting out of the way. A simple but great tool!”

Jeff Langr, developer

“I love it, it is a quantum leap in our collaboration.”

— Vasiliy Sivovolov, Senior Software Engineer

“What a great tool to organise remote working.”

Jennifer Gommans, IT Consultant

How to install

curl -sL install.mob.sh | sh

On windows you can use git bash to install mob or when you’re using Scoop:

scoop install mob

You can also install it on macOS via homebrew:

brew install remotemobprogramming/brew/mob

If you want to update to the latest version using Homebrew

brew upgrade remotemobprogramming/brew/mob

How to use

You only need three commands: mob start, mob next, and mob done. Switch to a separate branch with mob start and handover to the next person with mob next. Repeat. When you’re done, get your changes into the staging area of the master branch with mob done and commit them.

asciicast

mob enables a smooth Git handover

Basic Commands:
  start              start mob session from base branch in wip branch
  next               handover changes in wip branch to next person
  done               squashes all changes in wip branch to index in base branch
  reset              removes local and remote wip branch

Basic Commands(Options):
  start [<minutes>]                      Start a <minutes> timer
    [--include-uncommitted-changes|-i]   Move uncommitted changes to wip branch
    [--branch|-b <branch-postfix>]       Set wip branch to 'mob/<base-branch>/<branch-postfix>'
  next
    [--stay|-s]                          Stay on wip branch (default)
    [--return-to-base-branch|-r]         Return to base branch
    [--message|-m <commit-message>]      Override commit message
  done
    [--no-squash]                        Do not squash commits from wip branch
  reset
    [--branch|-b <branch-postfix>]       Set wip branch to 'mob/<base-branch>/<branch-postfix>'

Timer Commands:
  timer <minutes>    start a <minutes> timer
  start <minutes>    start mob session in wip branch and a timer

Get more information:
  status             show the status of the current mob session
  config             show all configuration options
  version            show the version of mob
  help               show help

Other
  moo                moo!


Add --debug to any option to enable verbose logging


Examples:
  # start 10 min session in wip branch 'mob-session'
  mob start 10

  # start session in wip branch 'mob/<base-branch>/green'
  mob start --branch green

  # handover code and return to base branch
  mob next --return-to-base-branch

  # squashes all commits and puts changes in index of base branch
  mob done

  # make a sound check
  mob moo

How does it work

More on Installation

Zoom Shortcuts

If you’re using Zoom for screen sharing, here’s a tip on how to speed up the Git Handover even further: We recommend configuring the global hotkey for toggling screen sharing in zoom in (Zoom > Preferences > Keyboard Shortcuts). So you can start and stop screen sharing anytime. More tips on setting up Zoom for effective screen sharing.

Arch Linux

There are two Arch packages in the AUR:

Example installation using AUR helper yay:

yay -S mobsh-bin

# OR
yay -S mobsh

Linux Timer

To get the timer to play “mob next” on your speakers when your time is up, you’ll need an installed speech engine. Install that on Debian/Ubuntu/Mint as follows:

sudo apt-get install espeak-ng-espeak mbrola-us1

Create a little script in your $PATH called say with the following content:

#!/bin/sh
espeak -v us-mbrola-1 "$@"

How to configure

Show your current configuration with mob config:

MOB_REMOTE_NAME=origin
MOB_WIP_COMMIT_MESSAGE=mob next [ci-skip]
MOB_VOICE_COMMAND=say
MOB_NOTIFY_COMMAND=/usr/bin/osascript -e 'display notification "%s"'
MOB_NEXT_STAY=true
MOB_START_INCLUDE_UNCOMMITTED_CHANGES=false
MOB_DEBUG=false
MOB_WIP_BRANCH_QUALIFIER=
MOB_WIP_BRANCH_QUALIFIER_SEPARATOR=-
MOB_DONE_SQUASH=true

Override default value permanently via environment variables:

export MOB_DEBUG=true

Override default value just for a single call:

MOB_DEBUG=true mob next

How to contribute

Propose your change in an issue or directly create a pull request with your improvements.

# PROJECT_ROOT is the root of the project/repository

cd $PROJECT_ROOT

git version # >= 2.17
go version # >= 1.15

go build # builds 'mob'

./create-testbed    # creates test assets

go test # runs all tests
go test -run TestDetermineBranches # runs the single test named 'TestDetermineBranches'

# run tests and show test coverage in browser
go test -coverprofile=cover.out && go tool cover -html=cover.out

Run the Tests from your IDE (GoLand or IntelliJ IDEA)

When you try to run mob_test.go in your IDE you may get the following errors:

./mob_test.go:17:2: undefined: configuration
./mob_test.go:17:18: undefined: getDefaultConfiguration
... and so on ...

This is because the Run Configuration uses Test Kind: File as default and therefor does not find the source code within mob.go. Change the Test Kind to Directory, and try again. The tests should work now.

Design Concepts

Who is using ‘mob’?

Credits

Developed and maintained by Dr. Simon Harrer.

Contributions and testing by Jochen Christ, Martin Huber, Franziska Dessart, Nikolas Hermann and Christoph Welcz. Thank you!

Logo designed by Sonja Scheungrab.