When I start work on a new series I have e.g. avar/various-tag-2 with its upstream info set to origin/master. When I start avar/various-tag-3 just: git checkcout -b avar/various-tag-3 avar/various-tag-2 I don't get the correct tracking info. As far as I can tell there's no way to do this in a single command, either you do: git checkout -b avar/various-tag-4 avar/various-tag-3 && git branch --set-upstream-to origin/master Or: git checkout -b avar/various-tag-3 -t origin/master && git reset --hard avar/various-tag-2 But both of these are really just a limited special case for what I'd really like, which is given branch "foo", copy it and all its configuration to a new name "bar". I.e. both of the hacks above only set up the correct tracking info, but none of the other branch.* variables I may have set. So I have this relative horror-show as an alias: $ git config alias.cp-branch !f() { git checkout -b $2 $1 && for line in $(git config --list --file .git/config | grep "^branch\.$1"); do key=$(echo $line | cut -d= -f1); newkey=$(echo $key | sed "s!$1!$2!"); value=$(echo $line | cut -d= -f2); git config $newkey $value; done; }; f Turned into a more readable tiny shell-script you can call git-cp-branch that's: #!/bin/sh -e git checkout -b $2 $1 for line in $(git config --list --file $(git rev-parse --git-dir)/config | grep "^branch\.$1"); do key=$(echo $line | cut -d= -f1) newkey=$(echo $key | sed "s!$1!$2!") value=$(echo $line | cut -d= -f2) git config $newkey $value done I couldn't find any previous list discussion about this, but if not I think something like: git [checkout|branch] --copy src dest Would make sense as an interface for this.