How do I push a new local branch to a remote Git repository and track it too?

Created 04.05.2010 12:58
Viewed 3.91M times
4743 votes

I want to be able to do the following:

  1. Create a local branch based on some other (remote or local) branch (via git branch or git checkout -b)

  2. Push the local branch to the remote repository (publish), but make it trackable so git pull and git push will work immediately.

How do I do that?

I know about --set-upstream in Git 1.7, but that is a post-creation action. I want to find a way to make a similar change when pushing the branch to the remote repository.

just to point out --set-upstream is -u by baye, 18.12.2013 10:12
lots of answers containing unrelated information (like how to create a branch) and if the answer applies, then information is missing regarding the magic parameters used. by Frank Puck, 20.08.2020 21:05
@VividD "added an illustrative picture" - Seriously? o.O by Andreas, 10.10.2020 14:46
Answers 15

In Git 1.7.0 and later, you can checkout a new branch:

git checkout -b <branch>

Edit files, add and commit. Then push with the -u (short for --set-upstream) option:

git push -u origin <branch>

Git will set up the tracking information during the push.

03.06.2011 20:50
It's also worth noting that if you have an existing tracking branch already set on the branch you're pushing, and push.default is set to upstream, this will not do what you think it will do. It will try to push over the existing tracking branch. Use: git push -u origin mynewfeature:mynewfeature or do git branch --unset-upstream first. by void.pointer, 19.05.2014 18:07
I still needed to 'git branch --set-upstream-to origin/remote' in order for 'git status' to correctly report my branch status with respect to the remote branch. by Paul Whipp, 04.07.2014 01:17
For people using Git from Visual Studio: Actually this is that "Publish Branch" in Visual Studio does. After executing git push with -u parameter i can finally see my branch as published in VS UI. by Puterdo Borato, 19.03.2015 11:19
For those still confused about the concept I like to "THINK" of it that git push -u origin myepicbranchname is equal to git checkout -b myepicbranchname in terms of what it does. Git push does do more but in terms of simplicity this is most likely what you want to know about the two ;) by SidOfc, 21.07.2015 15:14
Somewhat annoyingly, I found that git push -u origin branchname wasn't working, but that git push -u --set-upstream origin branchname did. This is with the PoshGit scripts provided with Github for Windows. by JonTheNiceGuy, 22.12.2016 14:32
Please bear in mind that if you want your remote branch to have a different name, you should change the name locally first. For example, let's say I have a branch locally named a-named-branch and I want to push it to remote. If I run git push origin new-named-branch I'll get an error that says error: src refspec new-named-branch does not match any. The fix is to run git branch -m new-named-branch and then running git push origin new-named-branch. by Jonathan Morales Vélez, 18.10.2017 12:00
You can also use git push -u origin HEAD by amaslenn, 19.12.2017 13:30
@Stephane You only need the -u once to initiate tracking. Afterward just use git push by Todd, 11.01.2018 14:49
@JonathanMoralesVélez changing the local branch is not necessary. You can push your local branch to any remote branch name like so: git push origin local-branch-name:remote-branch-name. Where origin is the name of the remote (often times actually "origin", local-branch-name is the actual name of your local branch name, and remote-branch-name is your desired branch name you want to push to. by Darren Felton, 04.11.2020 02:28
Show remaining 4 comments

If you are not sharing your repo with others, this is useful to push all your branches to the remote, and --set-upstream tracking correctly for you:

git push --all -u

(Not exactly what the OP was asking for, but this one-liner is pretty popular)

If you are sharing your repo with others this isn't really good form as you will clog up the repo with all your dodgy experimental branches.

20.01.2014 11:36
and git pull --all pulls it all back elsewhere ? kewl by commonpike, 19.10.2014 21:15
This command sets up tracking to the correct branch without the need to push anything. Thank you. by amey91, 21.01.2015 22:03
Git allows to commit a branch and not push it for very good reasons. Only using git push --all is like dropping a piece of git architecture. If it works for you, it is perfectly ok, great, do it forever. But PLEASE don't recommend others to avoid learning git just because it is a quick way to do things. by Federico Razzoli, 20.07.2016 08:24
This really isn't the right answer and isn't a good tool to be recommending without a real explanation of what it does and what the implications are. Please consider taking this answer down. by akronymn, 31.01.2017 14:30
@Federico @akronymn Where can one find the dangers of doing git push --all -u? by user1823664, 02.08.2017 16:46
@akronymn @ Federico - I've edited it to spell out what I see the dangers are - is that better? by ErichBSchulz, 19.03.2018 03:40
Show remaining 1 comments

Prior to the introduction of git push -u, there was no git push option to obtain what you desire. You had to add new configuration statements.

If you create a new branch using:

$ git checkout -b branchB
$ git push origin branchB:branchB

You can use the git config command to avoid editing directly the .git/config file:

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

Or you can edit manually the .git/config file to add tracking information to this branch:

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB
04.05.2010 13:03
sometimes your need this git push origin -u local_branch:remote_branch by Bruce Lee, 21.08.2018 06:28
why does "git push origin -u remote_branch_name " work sometimes and sometimes not? by mss, 26.07.2020 23:32

Simply put, to create a new local branch, do:

git branch <branch-name>

To push it to the remote repository, do:

git push -u origin <branch-name>
24.04.2015 12:09
git branch <branch-name> and git checkout -b <branch-name> both create a branch but checkout switch to the new branch by Robert, 11.08.2016 14:37
dude bracket is just to mention you have to replace with whatever branch name you want to create and push. by piyushmandovra, 30.05.2018 03:41
it's a nonexisting branch on remote, and reject with src branch-name does not match any by Adi Prasetyo, 06.04.2020 09:44
@AdiPrasetyo can you elaborate what you are trying to say/ask? by piyushmandovra, 08.06.2020 07:56

A slight variation of the solutions already given here:

  1. Create a local branch based on some other (remote or local) branch:

    git checkout -b branchname
  2. Push the local branch to the remote repository (publish), but make it trackable so git pull and git push will work immediately

    git push -u origin HEAD

    Using HEAD is a "handy way to push the current branch to the same name on the remote". Source: In Git terms, HEAD (in uppercase) is a reference to the top of the current branch (tree).

    The -u option is just short for --set-upstream. This will add an upstream tracking reference for the current branch. you can verify this by looking in your .git/config file:

    Enter image description here

05.07.2016 08:13
Thank you :) git push -u origin <branch-name> wasn't working for me but using HEAD instead of <branch-name> worked perfectly :) by Daniel Tonon, 07.11.2016 07:55

I simply do

git push -u origin localBranch:remoteBranchToBeCreated

over an already cloned project.

Git creates a new branch named remoteBranchToBeCreated under my commits I did in localBranch.

Edit: this changes your current local branch's (possibly named localBranch) upstream to origin/remoteBranchToBeCreated. To fix that, simply type:

git branch --set-upstream-to=origin/localBranch


git branch -u origin/localBranch

So your current local branch now tracks origin/localBranch back.

20.03.2017 11:13
This is what exactly i was actively looking for by eli, 14.05.2019 13:08
git throws error: src refspec <new branch> does not match any. when I try this. by codeforester, 06.07.2019 00:24
This should be the top answer. by Aditya Abhas, 13.05.2020 14:20

I suppose that you have already cloned a project like:

git clone
  1. Then in your local copy, create a new branch and check it out:

    git checkout -b <newbranch>
  2. Supposing that you made a "git bare --init" on your server and created the myapp.git, you should:

    git remote add origin ssh://
    git push origin master
  3. After that, users should be able to

    git clone

NOTE: I'm assuming that you have your server up and running. If it isn't, it won't work. A good how-to is here.


Add a remote branch:

git push origin master:new_feature_name

Check if everything is good (fetch origin and list remote branches):

git fetch origin
git branch -r

Create a local branch and track the remote branch:

git checkout -tb new_feature_name origin/new_feature_name

Update everything:

git pull
04.05.2010 13:04
William's script I linked to does about the same with the additional option to delete remote branches and some safeguards, too by Tobias Kienzler, 04.05.2010 13:07
>to push the local branch to remote repo (publish), but make it >trackable so git pull and git push will work immediately. its what github does automatically when you push your code to their repository :-) by VP., 04.05.2010 13:14
This does not respond to the question, the <newbranch> of the original repo is not trackable (and is renamed as <master> is the new repo you clone in step 3). by Lohrun, 04.05.2010 13:16
seems kind of overkill. does the git remote add origin make the local branch trackable? is that the key command here? by Roni Yaniv, 04.05.2010 13:21
@Roni Yaniv: no git remote add origin only register a new remote repository. It is just a step needed before pushing your branch to that remote repository (if you don't want to type the whole address each time) by Lohrun, 04.05.2010 13:25
well - we already have a remote repo (origin). i need a way to add a new local branch to that repo while making it trackable+pushable+pullable in the process. by Roni Yaniv, 04.05.2010 13:28
In git push origin master:new_feature_name command, master is the branch that you're working on. If you're on a different branch (let's call it oldbranch, and want to push to a newbranch, the command will be like git push origin oldbranch:newbranch . by Arda, 21.04.2016 22:05
Show remaining 2 comments

edit Outdated, just use git push -u origin $BRANCHNAME

Use git publish-branch from William's miscellaneous Git tools.

OK, no Ruby, so - ignoring the safeguards! - take the last three lines of the script and create a bash script, git-publish-branch:

REMOTE=$1 # Rewrite this to make it optional...
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

Then run git-publish-branch REMOTENAME BRANCHNAME, where REMOTENAME is usually origin (you may modify the script to take origin as default, etc...)

04.05.2010 13:03
this assumes I have ruby installed. no such luck. any other ideas? by Roni Yaniv, 04.05.2010 13:20
the ruby script calls git push and git config command. I used the code of the script to edit my answer. You might used this information to create a small shell script that does the puslishing for you. by Lohrun, 04.05.2010 13:31
William's miscellaneous git tools appears to have moved (that link is now dead). A working link is: by Mike D, 27.10.2014 02:08
"William's" link broken again; new link seems to be by ScottJ, 11.08.2016 01:07
Edited answer to just have the one working link ( by Devin Rhode, 16.01.2021 02:49

To create a new branch by branching off from an existing branch

git checkout -b <new_branch>

and then push this new branch to repository using

git push -u origin <new_branch>

This creates and pushes all local commits to a newly created remote branch origin/<new_branch>

03.06.2015 20:36

For GitLab version prior to 1.7, use:

git checkout -b name_branch

(name_branch, ex: master)

To push it to the remote repository, do:

git push -u origin name_new_branch

(name_new_branch, example: feature)

06.12.2016 18:42

I made an alias so that whenever I create a new branch, it will push and track the remote branch accordingly. I put following chunk into the .bash_profile file:

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
alias gcb=publishBranch

Usage: just type gcb thuy/do-sth-kool with thuy/do-sth-kool is my new branch name.

05.01.2016 10:11

You can do it in 2 steeps:

1. Use the checkout for create the local branch:

git checkout -b yourBranchName

Work with your Branch as you want.

2. Use the push command to autocreate the branch and send the code to the remote repository:

git push -u origin yourBanchName

There are mutiple ways to do this but I think that this way is really simple.

02.10.2019 10:11

Building slightly upon the answers here, I've wrapped this process up as a simple Bash script, which could of course be used as a Git alias as well.

The important addition to me is that this prompts me to run unit tests before committing and passes in the current branch name by default.


  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}


  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

function show_help()
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.           -> Displays prompt reminding you to run unit tests OK        -> Pushes the current branch as a new branch to the origin MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  echo "$IT"

if [ -z "$1" ]

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]

git push -u origin $BRANCH
21.04.2017 13:30

For greatest flexibility, you could use a custom Git command. For example, create the following Python script somewhere in your $PATH under the name git-publish and make it executable:

#!/usr/bin/env python3

import argparse
import subprocess
import sys

def publish(args):
    return['git', 'push', '--set-upstream', args.remote, args.branch]).returncode

def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
    return parser.parse_args()

def main():
    args = parse_args()
    return publish(args)

if __name__ == '__main__':

Then git publish -h will show you usage information:

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
31.12.2019 13:47

I think this is the simplest alias, add to your ~/.gitconfig

  publish-branch = !git push -u origin $(git rev-parse --abbrev-ref HEAD)

You just run

git publish-branch

and... it publishes the branch

16.01.2021 02:54