In zsh I am using the following function to delete a local and a remote branch with one command:

gpDo () {
    git branch -d "$1" && git push --delete origin "$1"

Currently, auto-completion for the Git branch does not work. I have to manually type the whole branch name. How can I get tab completion working for such as function?

1 Answer 1


I assume you're using the “new” completion system enabled by compinit. If you're using oh-my-zsh, you are.

You need to tell zsh to use git branch names for gpDo. Git already comes with a way to complete branch names. As of zsh 5.0.7 this is the function __git_branch_names but this isn't a stable interface so it could change in other versions. To use this function, put this line in your .zshrc:

compdef __git_branch_names gpDo

With this declaration, completion after gpDo will only work after you've completed something on a git command line at least once. This is due to a quirk of function autoloading in zsh. Alternatively, run _git 2>/dev/null in your .zshrc; this causes an error because the completion function is called in an invalid context, but the error is harmless, and the side effect of loading _git and associated functions including __git_branch_names` remains.

Alternatively, define your own function for git branch completion. Quick-and-dirty way:

_JJD_git_branch_names () {
  compadd "${(@)${(f)$(git branch -a)}#??}"
  • 1
    I tried your first approach with having zsh 5.1.1 installed. It fails with the error gpDo (eval):1: command not found: __git_branch_names. Please note that I am also using oh-my-zsh if this allows for another solution.
    – JJD
    Mar 15, 2016 at 11:15
  • 1
    @JJD Had you already performed a completion with git? That loads the function. Alternatively you can run _git once, which loads and executes the function (there's no way to load an autoloaded function without executing it, unfortunately). Mar 15, 2016 at 11:44

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .