`git push $remote $local_branch:$remote_branch`.  $remote comes from `branch.<name>.remote` (e.g. `git config branch.master.remote`) and $remote_branch comes from `branch.<name>.merge`, with `refs/heads/` chopped off.

If `$local_branch == $remote_branch` then use the simpler syntax without `:` between local and remote, e.g. `git push origin master`.  The reason for doing this instead of blindly saying `git push` is that we do not know the value of `push.default`.  `git push` can behave differently unless you're explicit.

It's might be worth moving all this logic into a class the cmds module.