Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
List only local branches when autocompleting git checkout (Zsh)
git config --global alias.checkoutr checkout
$EDITOR /usr/local/share/zsh/site-functions/git-completion.bash

...and then modify the file as follows...

-__gitcomp_nl "$(__git_refs '' $track)"
+if [ "$command" = "checkoutr" ]; then
+    __gitcomp_nl "$(__git_refs '' $track)"
+else
+    __gitcomp_nl "$(__git_heads '' $track)"
+fi

... and source your shell (source ~/.bashrc / source ~/.zshrc...).

Use git checkoutr for the default behavior and git checkout (or just gco) for browsing only local branches. Credits to http://cmetcalfe.ca/blog/git-checkout-autocomplete-local-branches-only.html.

@aok1425

This comment has been minimized.

Copy link

@aok1425 aok1425 commented Oct 2, 2017

Because of changes made to the git repo as of Mar 23, 2017, the changes are now:

-__git_complete_refs $track_opt
+if [ "$command" = "checkoutr" ]; then
+    __git_complete_refs $track_opt
+else
+    __gitcomp_nl "$(__git_heads '' $track)"
+fi

On my Mac, the file is in $(brew --prefix)/etc/bash_completion.d/git-completion.bash.

@mmrko

This comment has been minimized.

Copy link
Owner Author

@mmrko mmrko commented Oct 7, 2017

Thanks for pointing that out! 👍

@elcortez

This comment has been minimized.

Copy link

@elcortez elcortez commented Feb 8, 2018

You just saved me from hundreds of tiny frustrations :)

@keenahn

This comment has been minimized.

Copy link

@keenahn keenahn commented Jan 4, 2019

@aok1425 @mmrko thanks a million. Got here through Google.

@joelhock

This comment has been minimized.

Copy link

@joelhock joelhock commented Jan 17, 2019

yeah, this is great. i had to do additional machinery to store the original $command to get checkoutr to work; i think the git repo's source might necessitate that now.

@alswl

This comment has been minimized.

Copy link

@alswl alswl commented Mar 18, 2019

/usr/local/share/zsh/site-functions/git-completion.bash works for me.

macOS, zsh in brew + oh-my-zsh

@zihotki

This comment has been minimized.

Copy link

@zihotki zihotki commented Mar 25, 2019

I'm encountering one issue, I can't make checkoutr working. For some reason when any alias is used for checkout the $command parameter is always checkout but not checkoutr or any other alias. I'm using bash on Windows. Did anybody encounter it? To test I'm using the same snippet with echos:

        if [ "$command" = "rcheckout" ]; then
            echo "rcheckout!"
            __git_complete_refs $track_opt            
        else
            echo "checkout!"
            __gitcomp_nl "$(__git_heads '' $track)"
        fi
@CodeRedDev

This comment has been minimized.

Copy link

@CodeRedDev CodeRedDev commented Jul 19, 2019

@zihotki I just encountered the same issue. I'm just using normal Mac bash aliases and my solution was just to create a copy of _git_checkout that will be called from my remote checkout alias.

@OmisNomis

This comment has been minimized.

Copy link

@OmisNomis OmisNomis commented Nov 12, 2019

I've added the amended _git_checkout () function in my .zshrc file, but the function doesn't work unless I manually source for every new terminal session.

I assume this is because the git plugin is loaded after the redeclaration, is there a way around this? Currently, I've amended the git-completion.bash file manually.

@gkop

This comment has been minimized.

Copy link

@gkop gkop commented Aug 31, 2020

In hopes that it could save another person some time debugging, I just wanted to say I found that I needed to install git from homebrew, and then the autocompletion worked perfectly out of the box with macos Mojave and oh-my-zsh. The system git that comes with developer tools had otherwise worked well for me, I never realized that I was even using it versus git from brew. But for the autocompletion of local branches only to work, I found I needed git from brew.

@mrinal-scio

This comment has been minimized.

Copy link

@mrinal-scio mrinal-scio commented Dec 10, 2020

To get this working on zsh, you might need to get https://github.com/git/git/blob/master/contrib/completion/git-completion.zsh, follow the instructions in the comments to setup a link to git-completion.bash, then edit the latter file according to the instructions above

Note that the $track variable has now been renamed to $dwim

@luoluoluolin

This comment has been minimized.

Copy link

@luoluoluolin luoluoluolin commented Feb 25, 2021

For new version of git(2.30.1):

  1. modify file /usr/local/share/zsh/site-functions/git-completion.bash: copy shell function _git_checkout to _git_checkoutr, then change _git_checkout function below:
if [ -n "$(__git_find_on_cmdline "-b -B -d --detach --orphan")" ]; then
-			__git_complete_refs --mode="refs"
+			__git_complete_refs --mode="heads"
		elif [ -n "$(__git_find_on_cmdline "--track")" ]; then
			__git_complete_refs --mode="remote-heads"
		else
-			__git_complete_refs $dwim_opt --mode="refs"
+			__git_complete_refs $dwim_opt --mode="heads"
		fi
  1. add GIT_COMPLETION_CHECKOUT_NO_GUESS=1 to .zshrc/.bash_profile
  2. git config --global alias.checkoutr checkout
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment