3347

I created a local branch which I want to 'push' upstream. There is a similar question here on Stack Overflow on how to track a newly created remote branch.

However, my workflow is slightly different. First I want to create a local branch, and I will only push it upstream when I'm satisfied and want to share my branch.

  • How would I do that? (my google searches did not seem to come up with anything).
  • How would I tell my colleagues to pull it from the upstream repository?

UPDATE With Git 2.0 there is a simpler answer I have written below: https://stackoverflow.com/a/27185855/109305

Community
  • 1
  • 1
Jesper Rønn-Jensen
  • 91,561
  • 40
  • 112
  • 147
  • 15
    did anyone ever answer you second question? >>And how would I tell my colleagues to pull it from the upstream repository? – milkplus Oct 27 '10 at 22:14
  • Possibly related: [Pro Git: 3.5 Git Branching - Remote Branches](http://git-scm.com/book/en/Git-Branching-Remote-Branches). –  May 05 '14 at 04:19
  • 1
    @milkplus `get fetch --all` fetches the new branches on the remote side (but only a `get fetch --prune` deletes locally the references to the deleted remote branches). I think, either this should be set up by them automatically, or you have to talk to them verbally. – peterh Mar 29 '17 at 12:15
  • 1
    Possible duplicate of [How do I push a new local branch to a remote Git repository and track it too?](https://stackoverflow.com/questions/2765421/how-do-i-push-a-new-local-branch-to-a-remote-git-repository-and-track-it-too) – Trevor Boyd Smith Feb 23 '18 at 20:19
  • _There is a similar question here on Stack Overflow on how to track a newly created remote branch._ - You haven't told us what question you have in mind. My guess would be https://stackoverflow.com/questions/520650. In line with the comment by @Trevor Boyd Smith I consider both your question here _and_ [that question](https://stackoverflow.com/questions/520650) duplicates of https://stackoverflow.com/questions/2765421/. – Henke Dec 05 '20 at 08:14

24 Answers24

3938

First, you create your branch locally:

git checkout -b <branch-name> # Create a new branch and check it out

The remote branch is automatically created when you push it to the remote server. So when you feel ready for it, you can do:

git push <remote-name> <branch-name> 

Where <remote-name> is typically origin, the name which git gives to the remote you cloned from. Your colleagues would then just pull that branch, and it's automatically created locally.

Note however that formally, the format is:

git push <remote-name> <local-branch-name>:<remote-branch-name>

But when you omit one, it assumes both branch names are the same. Having said this, as a word of caution, do not make the critical mistake of specifying only :<remote-branch-name> (with the colon), or the remote branch will be deleted!

So that a subsequent git pull will know what to do, you might instead want to use:

git push --set-upstream <remote-name> <local-branch-name> 

As described below, the --set-upstream option sets up an upstream branch:

For every branch that is up to date or successfully pushed, add upstream (tracking) reference, used by argument-less git-pull(1) and other commands.

Harry B
  • 2,511
  • 1
  • 17
  • 40
Ikke
  • 90,705
  • 23
  • 91
  • 118
  • 89
    Note that default behavior of git is to push ***matching*** refs, so `git push ` would not push branch if it is not present on ``. – Jakub Narębski Oct 05 '09 at 21:55
  • 229
    You might want to use `git push -u ` instead, so that a subsequent `git pull` will know what to do. – Bart Schuller Apr 06 '11 at 15:03
  • 88
    Instead of explicitly specifying the server name, you can just use `origin`, which means "the server I got the rest of this repo from": thus `git push origin `. – lambshaanxy May 16 '11 at 06:31
  • 3
    @Bart-Schuller, the `-u` is very important! I keep coming back to this question/answer to remember it. – livingtech Jun 28 '11 at 19:58
  • 1
    in my case `git push :` works, but `git push ` get error "error: src refspec current does not match any." – bartolo-otrit Jul 06 '11 at 07:32
  • 1
    If it's a new branch on the remote it seems it's not enough, I got: `error: unable to push to unqualified destination: branch-name The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref.` I had to prefix the remote branch name with `refs/` to make it work. Thus `git push :`. – Zitrax Jul 25 '11 at 09:16
  • 69
    If you forget to use the `-u` option, you can just type `git push -u` afterwards in the branch, then `git pull` will work. – Jan Jul 28 '11 at 13:07
  • 2
    @Jan If you don't specify a branch name, this will setup remote tracking on *all* of your branches. Not normally a bad thing, but something to be aware of. – hafichuk May 31 '12 at 18:54
  • 91
    Putting it all together, `git push -u origin ` is what worked for me. – Samo Jun 15 '12 at 19:14
  • For me, I have to `git checkout -b your_branch` first. – Andres Riofrio Dec 12 '12 at 22:48
  • @AndresRiofrio That would create a new branch based on the current branch. – Ikke Dec 13 '12 at 10:40
  • @Snicolas What you described is possible, but not necessary. You can leave out the remote-branch-name and git will use the same name as the local branch. – Ikke Apr 08 '13 at 09:33
  • 1
    This solution doesn't works for me (maybe because I'm using the new default of `push.default`, which is `simple`). It works only if the local branch creation uses -t: `git checkout -t -b your_branch`. I'm wondering how to push a branch created without the `-t`, though. – mMontu Sep 05 '13 at 18:30
  • Arh! Where could be "origin"... Damn that took me a while to figure out [still noob] – mlunoe May 22 '14 at 21:44
  • Yes, need to put this to memory. – Donato Jun 16 '15 at 00:43
  • when to do git add and git commit ? before creating local branch or after that? – user1735921 Oct 07 '15 at 16:29
  • @user1735921 Add and commit should happen after you created the branch, otherwise that commit would be created on the current branch. – Ikke Oct 07 '15 at 17:24
  • Is `your_branch` and `branch-name` the same? Is my remote name origin or master? I'm a little confused here – Hrvoje T Oct 16 '15 at 10:30
  • @HrvojeT I made the branch-name more consistent. The remote name is explained in the post, but master is (almost) never the name of a remote (unless someone gets it into their mind to call their remote master). – Ikke Oct 16 '15 at 11:46
  • So, __origin__ is a remote repository, and __master__ and __branch-name__ are branches in that remote repository, usually – Hrvoje T Oct 16 '15 at 12:44
  • @Torek - Yet another accepted answer that does not work... *`git checkout -b constexpr`* results in *`Switched to a new branch 'constexpr'`*. Then *`git push constexpr constexpr`* results in *`fatal: 'constexpr' does not appear to be a git repository. fatal: Could not read from remote repository.`*. Does the crap ever end with Git and its inability to manage source code??? How much more complicated can Git make simple tasks??? – jww Sep 02 '16 at 03:21
  • @jww If you read correctly, you see it says: git push **** . You failed to specify a remote, and just repeated the branch name twice. – Ikke Sep 02 '16 at 05:56
  • Is there any way that I can create a remote branch from another remote branch without fetching it locally? – RAGHU RAMAN Nov 22 '16 at 09:18
  • What `-b` does in `git checkout -b ` ? – Shafizadeh Jan 04 '17 at 19:47
  • 1
    @Shafizadeh It tells git checkout you want to create a new branch (instead of checking out an existing one or checking out a file). – Ikke Jan 05 '17 at 12:50
  • 1
    `git push -u origin ` – Amir Ziarati Apr 12 '17 at 06:45
  • For those a little confused about the `-u`, [here's a better explanation](https://stackoverflow.com/questions/5697750/what-exactly-does-the-u-do-git-push-u-origin-master-vs-git-push-origin-ma). – Shanky Mar 12 '19 at 06:33
925

First, you must create your branch locally

git checkout -b your_branch

After that, you can work locally in your branch, when you are ready to share the branch, push it. The next command push the branch to the remote repository origin and tracks it

git push -u origin your_branch

Teammates can reach your branch, by doing:

git fetch
git checkout origin/your_branch

You can continue working in the branch and pushing whenever you want without passing arguments to git push (argumentless git push will push the master to remote master, your_branch local to remote your_branch, etc...)

git push

Teammates can push to your branch by doing commits and then push explicitly

... work ...
git commit
... work ...
git commit
git push origin HEAD:refs/heads/your_branch

Or tracking the branch to avoid the arguments to git push

git checkout --track -b your_branch origin/your_branch
... work ...
git commit
... work ...
git commit
git push
dseminara
  • 10,767
  • 2
  • 18
  • 21
362

Simple Git 2.0+ solution:

As of Git 2.0, the behavior has become simpler:

You can configure git with push.default = current to make life easier:

I added this so now I can just push a new branch upstream with

$ git push -u

-u will track remote branch of the same name. Now with this configuration, you will auto-guess the remote reference to git push. From git.config documentation:

push.default

Defines the action git push should take if no refspec is explicitly given.

push.default = current - push the current branch to update a branch with the same name on the receiving end. Works in both central and non-central workflows.

For me, this is a good simplification of my day-to-day Git workflow. The configuration setting takes care of the 'usual' use case where you add a branch locally and want to create it remotely. Also, I can just as easily create local branches from remotes by just doing git co remote_branch_name (as opposed to using --set-upstream-to flag).

I know this question and the accepted answers are rather old, but the behavior has changed so that now configuration options exist to make your workflow simpler.

To add to your global Git configuration, run this on the command line:

$ git config --global push.default current
Andhi Irawan
  • 404
  • 6
  • 13
Jesper Rønn-Jensen
  • 91,561
  • 40
  • 112
  • 147
  • 5
    I find `git push -u origin HEAD` as answered [here](https://stackoverflow.com/a/21991290/2448440) a bit more verbose (you write what you are doing) without being too much to type. Furthermore, a `git push -u` without additional arguments did not work for me if the branch was created with `-t` – Qw3ry Sep 25 '17 at 07:37
  • `git config --global push.default upstream && git checkout -b foo && && git push -u` does not work (as of git 2.19.1); push requires the remote and branch arguments. – knite Nov 07 '18 at 02:37
  • Could you expand on what you mean by `git co remote_branch_name`? – Chris Karpyszyn Sep 16 '19 at 20:35
  • Didn't work for me. Solved by adding to `~/.profile`: `function gitb() { git checkout -b $1 && git push --set-upstream origin $1; }` and then can do `gitb feature/abcd` - this sets it up for `git pull` and `git push` without extra arguments + pushes the new branch into the remote repo to verify that the name is really free. – youurayy Jun 09 '20 at 20:35
  • @youurayy you probably forgot also to add `-u` flag to `git push -u` and also check your `git config --list` that it contains `push.default=current` For me, `git push -u` just works. Also be aware that as of Git v2.27, you are prompted to set a default push strategy. So maybe your defaults are not different? – Jesper Rønn-Jensen Jun 10 '20 at 06:28
  • @JesperRønn-Jensen see that is exactly the point -- one simple alias-like bash function, and you don't have to remember nor do any of those. – youurayy Jun 10 '20 at 18:55
89

As stated in the previous answers,

git push <remote-name> <local-branch-name>:<remote-branch-name>

is enough for pushing a local branch.

Your colleagues, can pull all remote branches (including new ones) with this command:

git remote update

Then, to make changes on the branch, the usual flow:

git checkout -b <local-branch-name> <remote-name>/<remote-branch-name>
Tim Cooper
  • 144,163
  • 35
  • 302
  • 261
Lucian
  • 998
  • 6
  • 4
74

Create a new branch locally based on the current branch:

git checkout -b newbranch

Commit any changes as you normally would. Then, push it upstream:

git push -u origin HEAD

This is a shortcut to push the current branch to a branch of the same name on origin and track it so that you don't need to specify origin HEAD in the future.

Zenexer
  • 16,313
  • 6
  • 62
  • 72
  • 4
    This helped in my case: `git push -u origin HEAD`. I think it's the most clear way. – Scadge Mar 07 '14 at 12:12
  • 2
    Yeah, you never remember what you last typed as a branch, exactly, so this is the way to go. – marksyzm Feb 23 '16 at 11:34
  • 5
    @marksyzm If you can't remember what branch you're on or what you named it, you probably shouldn't be pushing at all! At least, not without running `git status` first. – Zenexer Mar 09 '16 at 05:40
  • 1
    Yeah, gotta make sure the world doesn't explode on that push; I agree. – marksyzm Mar 09 '16 at 11:24
  • 2
    This is the most efficient way to create a tracking branch as well as a remote branch at the same time. I'd also like to add `git remote show origin` as a third step just to visualize the new tracking/tracked relationship. – hb5fa Sep 12 '16 at 14:39
64

If you want to create a branch from the current branch

git checkout -b {your_local_branch_name} 

    

you want a branch from a remote branch, you can try

git checkout -b {your_local_branch_name} origin/<remote_branch_name>

If you are done with changes you can add the file.

git add -A or git add <each_file_names>

Then do a commit locally

git commit -m 'your commit message'

When you want to push to remote repo

git push -u origin <your_local_branch_name>

All together will be

git checkout -b bug_fixes 

or If you want to create a local branch bug_fixes from a remote branch, say development

git checkout -b bug_fixes origin/development

You can push to the branch to remote repo by

git push -u origin bug_fixes

Anytime you want to update your branch from any other branch say master,

git pull origin master
hashbrown
  • 3,240
  • 1
  • 15
  • 33
sreekumar
  • 2,059
  • 1
  • 18
  • 25
57

[Quick Answer]

You can do it in 2 steps:

1. Use the checkout for create the local branch:

git checkout -b yourBranchName

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

git push -u origin yourBranchName

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

Community
  • 1
  • 1
Javier C.
  • 6,011
  • 4
  • 33
  • 46
49

If you wanna actually just create remote branch without having the local one, you can do it like this:

git push origin HEAD:refs/heads/foo

It pushes whatever is your HEAD to branch foo that did not exist on the remote.

Tassadar
  • 1,733
  • 1
  • 14
  • 11
  • Doing this completely confused my Visual Studio to the point where it wouldn't start up correctly. The Team Explorer wouldn't load at all, but everything else went bonkers throwing errors also. Just FYI. – Josh Jun 27 '16 at 20:04
  • This sounds like it should work, but when I actually tried it, the our gitlab server didn't recognise the result as a branch. – JosephH Nov 25 '16 at 18:25
  • What branch is foo branched off of on the remote? What if I wanted to foo to branch off of foo2? Is that possible? Thank you. – user674669 Sep 08 '17 at 21:33
  • 1
    It works on gerrit server as well, creating a new branch on the remote that didn't exist before this command. – MichaelZ Aug 09 '19 at 18:23
34

Easiest Solution... Drumm Roll... git version 2.10.1 (Apple Git-78)

1) git checkout -b localBranchNameThatDoesNotExistInRemote

2) Do your changes, and do a git commit 

3) git push origin localBranchNameThatDoesNotExistInRemote --force

N.B. - The branch you just created in your local environment, and the remote non-existing branch where you are trying to push, must have the same name.

captainblack
  • 2,806
  • 5
  • 42
  • 49
sapy
  • 6,665
  • 6
  • 40
  • 51
  • 3
    Thanks for your suggestion. Even though you call this an easy solution, I still think `git push -u` is way easier. Requires that you have one global config line, see http://stackoverflow.com/a/27185855/109305. I use `git push -u` constantly, it covers 99% of my usecases when working. – Jesper Rønn-Jensen Mar 18 '17 at 14:24
26

First you create the branch locally:

git checkout -b your_branch

And then to create the branch remotely:

git push --set-upstream origin your_branch

Note: This works on the latests versions of git:

$ git --version
git version 2.3.0

Cheers!

ipegasus
  • 12,519
  • 7
  • 45
  • 66
  • This is just the help text generated by the command `git push` when your local branch is not tracked by a remote. – nurettin Jan 04 '18 at 08:08
18

Create the branch on your local machine and switch in this branch :

$ git checkout -b [name_of_your_new_branch]

Push the branch on github :

$ git push origin [name_of_your_new_branch]

When you want to commit something in your branch, be sure to be in your branch.

You can see all branches created by using :

$ git branch

Which will show :

* approval_messages
  master
  master_clean

Add a new remote for your branch :

$ git remote add [name_of_your_remote] 

Push changes from your commit into your branch :

$ git push origin [name_of_your_remote]

Update your branch when the original branch from official repository has been updated :

$ git fetch [name_of_your_remote]

Then you need to apply to merge changes, if your branch is derivated from develop you need to do :

$ git merge [name_of_your_remote]/develop

Delete a branch on your local filesystem :

$ git branch -d [name_of_your_new_branch]

To force the deletion of local branch on your filesystem :

$ git branch -D [name_of_your_new_branch]

Delete the branch on github :

$ git push origin :[name_of_your_new_branch]

Here All Information

Other Existing project

Numan Turkeri
  • 472
  • 4
  • 13
14

Creating a local branch from an existing branch (can be master/ develop/ any-other-branch).

git checkout -b branch_name

Push this to remote

git push -u remote_name local_branch_name:remote_branch_name

Here,

  1. -u : sets the upstream branch
  2. remote_name : git sets the name by default to be "origin" when it creates the repository. This can however be changed to a different arbitrary name.
  3. local_branch_name : is the name of the local branch to be pushed.
  4. remote_branch_name : is the name of the remote branch that we want to be created on remote.

If we remove the local and remote branch names, it will have the format

git push -u remote_name branch_name

This will push the local branch to remote and with the same name as the local branch branch_name. The local branch will be tracking the remote branch as well.

iosCurator
  • 3,498
  • 2
  • 19
  • 25
10

I know this question is well answered, but just wanted to list the steps I take to create a new branch "myNewBranch" and push to remote ("origin" in my case) and set up tracking. Consider this the "TL;DR" version :)

# create new branch and checkout that branch
git checkout -b myNewBranch
# now push branch to remote 
git push origin myNewBranch
# set up the new branch to track remote branch from origin
git branch --set-upstream-to=origin/myNewBranch myNewBranch
sufinawaz
  • 3,358
  • 1
  • 22
  • 23
8

Now with git, you can just type, when you are in the correct branch

git push --set-upstream origin <remote-branch-name>

and git create for you the origin branch.

8

Just wanted to add that while:

git checkout -b {branchName}

Creates a new branch, it also checks out that branch / makes it your current branch. If, for some reason, all you want to do is snap off a branch but not make it your current branch, then you would use the following command:

git branch {branchName}

In the first command, "checkout" makes said branch your current branch, and the "-b" means: this branch doesn't exist yet, so make it for me.

Brian Sachetta
  • 2,821
  • 2
  • 29
  • 42
6

How to do through Source Tree

 1: Open SourceTree, click on Repository -> Checkout
 2: Click on Create New Branch
 3: Select the branch where you want to get code for new branch 
 4: Give your branch name
 5: Push the branch  (by click on Push-button)
Andhi Irawan
  • 404
  • 6
  • 13
Monis Majeed
  • 1,230
  • 13
  • 20
5

git push -u <remote-name> <branch-name> doesn't work if the newly created branch isn't spawned from the same repo, i.e. if you haven't created the new branch using git checkout -b new_branch, then this will not work.

For eg, I had cloned two different repositories locally and I had to copy repo2/branch1 to repo1/ and then push it too.

This link helped me push my local branch (cloned from another repo) to my remote repo:

brokenfoot
  • 9,630
  • 9
  • 46
  • 71
4

Here is how you do it in eclipse through Egit.

  1. Go the "Git Repository Exploring" view and expand the git project to which you want to create a branch. Under Branches -> Local .. select the branch for which you want to create the branch ( In my case I selected master .. you can select another branch if you wish) .. then right click and click on Create Branch option .. and select the checkout this project option and then click the finish button.

  2. Now from the project explorer select the project .. right click then Team -> Push Branch.

A new remote branch will be created. You can give the name of the branch to your colleagues so that they can pull it.

Andhi Irawan
  • 404
  • 6
  • 13
user2225713
  • 215
  • 2
  • 9
  • Tangential warning about Egit -- and all JGit-based clients, AFAIK: they don't support .gitattributes! This means if your team uses a mix of Windows(CRLF) and Linux/OSX(LF) you must depend on each client having the right settings at all times. Naturally it's better to manage line endings centrally at the repo or project level, and .gitattributes is the supported way to do this. So, if you don't absolutely have to use Egit... don't! :) – cweekly May 19 '14 at 21:46
2

I have used two ways to create branch

If you are using TortoiseGit follow these steps:-

1.Create Branch using TortoiseGit

Right click on your project >>> TortoiseGit >>> Create Branch >>> write the name of branch and select the base branch then press ok

2.Push the branch

Right click on your project >>> TortoiseGit >>> push >>> click ok

3.Switch to new branch

Right click on your project >>> TortoiseGit >>> Switch/Checkout >>> select newly created branch and press ok

If you are using command prompt follow these steps:-

1.Create branch using command prompt

$git checkout -b new_branch_name

2.Push the branch

$git push origin new_branch_name

3.Switch to new branch it will already switched to new_branch_name otherwise you can use

$git checkout new_branch_name

1

you can simply ,

  1. git checkout -b YOUR-NEW-BRANCH-NAME
  2. git add .
  3. git push origin YOUR-NEW-BRANCH-NAME

you can see your branch with the code under the relevant git repo

Cheers !! :)

0

I use this and it is pretty handy:

git config --global alias.mkdir '!git checkout -b $1; git status; git push -u origin $1; exit;'

Usage: git mkdir NEW_BRANCH

You don't even need git status; maybe, I just want to make sure everything is going well...

You can have BOTH the LOCAL and REMOTE branch with a single command.

Tarik
  • 3,543
  • 31
  • 29
0

I've solved this by adding this into my bash ~/.profile:

function gitb() { git checkout -b $1 && git push --set-upstream origin $1; }

Then to start up a new local + remote branch, I write:

gitb feature/mynewbranch

This creates the branch and does the first push, not just to setup tracking (so that later git pull and git push work without extra arguments), but actually confirming that the target repo doesn't already have such branch in it.

youurayy
  • 1,499
  • 1
  • 15
  • 11
0

Heres an example I only have two branches that were local first: origin and mobile-test.

Nothing for me worked until I used this in command line to actually show my updated files in a remote branch.

git push --set-upstream origin mobile-test
0

If you have used --single-branch to clone the current branch, use this to create a new branch from the current:

git checkout -b <new-branch-name>
git push -u origin <new-branch-name>
git remote set-branches origin --add <new-branch-name>
git fetch
Ali Kleit
  • 1,677
  • 2
  • 15
  • 26