This is hideous.  What about having branchList(), branchCreate(), branchRename(), branchDelete() methods on Git that create different command objects for each operation?

I think callers can handle typing branchCreate() vs. branch().setCreate(...)