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

Roni Yaniv Source

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.

gitrepositorygit-branchgit-push

Answers

answered 8 years ago Lohrun #1

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 had tracking information to this branch.

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB

answered 8 years ago Tobias Kienzler #2

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


Use git publish-branch from William's miscellaneous Git tools (gitorious repo and clone).

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

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# 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...)

answered 8 years ago VP. #3

I suppose that you have already cloned a project like:

git clone http://github.com/myproject.git
  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://example.com/var/git/myapp.git
    git push origin master
    
  3. After that, users should be able to

    git clone http://example.com/var/git/myapp.git
    

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.

ADDED

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

answered 7 years ago Daniel Ruoso #4

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.

answered 4 years ago ErichBSchulz #5

This will 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)

answered 3 years ago piyushmandovra #6

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>

answered 3 years ago cptjack #7

To create a new branch by branching off from 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>

answered 3 years ago shankar kumar #8

To upload your local branch of a public repository, you need to cd to the public repository and then use the following code:

git push -u origin branchname

answered 2 years ago Thuy Trinh #9

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.

answered 2 years ago bg17aw #10

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: https://git-scm.com/docs/git-push 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-setupstream. 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

answered 1 year ago Fadid #11

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)

answered 11 months ago Arda #12

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.

answered 10 months ago Brad Parks #13

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.

$ git_push_new_branch.sh                                                             

  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.

  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

git_push_new_branch.sh

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. 

  git_push_new_branch.sh           -> displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

function old()
{
  git push --set-upstream origin $BRANCH
  git push
}

git push -u origin $BRANCH

comments powered by Disqus