switch branch in git by partial name switch branch in git by partial name shell shell

switch branch in git by partial name


There are very few occasions where you'd want to checkout remotes/origin/*. They exist but for the purposes of this shortcut, let's not worry about them. This will get you what you want on OSX:

git config --global alias.sco '!sh -c "git branch -a | grep -v remotes | grep $1 | xargs git checkout"'

You can then issue git sco <number> to checkout a branch that includes <number> but excludes "remotes". You can change sco to be anything you'd like. I just picked it for "super checkout".

Of course this won't work terribly well if you've got more than one branch that matches <number>. It should, however, be a decent starting point.


Here is my solution with fuzzy checkout:Add the alias to your ~/.gitconfig by run

git config --global alias.fc '!f() { git branch -a | grep -m1 -e ${1}.*${2} | sed "s/remotes\/origin\///" | xargs git checkout; }; f'

The command above will add the alias to your ~/.gitconfig:

[alias]    # fuzzy checkout branch, e.g: git cb feature 739, will checkout branch feature/PGIA-739-deploy-maximum    fc = "!f() { git branch -a | grep -m1 -e ${1}.*${2} | sed \"s/remotes\\/origin\\///\" | xargs git checkout; }; f" 

The alias can have 2 parameters for the fuzzy matching, you can use it like:

git fc <keyword1> <keyword2>

It will find the checkout the branch first match

For example, if you want to checkout your branch 1178, you can run:

git fc 1178

the alias fc supports two parameters, if you want more accurate matching, you also can run:

git fc 1178 auth

You also can find my other favorite snippets here


Here's the solution I came up with for myself.

[ ${#} -ne 1 ] && { echo -e "Please provide one search string" ; exit 1 ; }MATCHES=( $(git branch -a --color=never | sed -r 's|^[* ] (remotes/origin/)?||' | sort -u | grep -E "^((feature|bugfix|release|hotfix)/)?([A-Z]+-[1-9][0-9]*-)?${1}") )case ${#MATCHES[@]} in  ( 0 ) echo "No branches matched '${1}'" ; exit 1  ;;  ( 1 ) git checkout "${MATCHES[0]}"      ; exit $? ;;esacecho "Ambiguous search '${1}'; returned ${#MATCHES[@]} matches:"for ITEM in "${MATCHES[@]}" ; do  echo -e "  ${ITEM}"doneexit 1

I called it git-rcheckout ("r" for regex, for want of a better name) and placed it in my path (it's a little too long to shoehorn into my .gitconfig.)

It will attempt to match against local and remote branches (though only checks out locals), and will tolerate (IE disregard for the purposes of searching) some JIRA stylings, such as branches starting with common prefixes and things styled like JIRA ticket IDs.

e.g. Typing this:

git rcheckout this

Should match things like

this-branchfeature/this-branchbugfix/JIRA-123-this-branchJIRA-123-this-branchremotes/origin/this-branchremotes/origin/feature/this-branchremotes/origin/bugfix/JIRA-123-this-branchremotes/origin/JIRA-123-this-branch

But the regexes I've used are sufficiently tolerant that you could also do:

git rcheckout JIRA-123

To access:

bugfix/JIRA-123-this-branchJIRA-123-this-branchremotes/origin/bugfix/JIRA-123-this-branchremotes/origin/JIRA-123-this-branch

It defaults to searching for branch prefixes, but actually you can use regexes to do fancier things if desired, like so:

git rcheckout '.*bran'git rcheckout '.*is-br.*h'