1521

I use the following command to push to my remote branch:

git push origin sandbox

If I say

git push origin

does that push changes in my other branches too, or does it only update my current branch? I have three branches: master, production and sandbox.

The git push documentation is not very clear about this, so I'd like to clarify this for good.

Which branches and remotes do the following git push commands update exactly?

git push 
git push origin

origin above is a remote.

I understand that git push [remote] [branch] will push only that branch to the remote.

Nick Volynkin
  • 14,023
  • 6
  • 43
  • 67
Debajit
  • 46,327
  • 33
  • 91
  • 100
  • Regarding the configuration of diff tools in general, and the new script git difftool, I have added a new answer in this other SO question: http://stackoverflow.com/questions/255202/how-do-i-view-git-diff-output-with-visual-diff-program/949242#949242 – VonC Jun 04 '09 at 08:29
  • 73
    I did a [blog post](http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/) about the surprising behaviour of `git push`, which might be of interest – Mark Longair Mar 04 '11 at 07:28
  • 2
    @Mark: in other work, pushing only the current branch to its tracked upstream. Nice. – VonC Mar 04 '11 at 07:42
  • http://stackoverflow.com/q/13148066/2157640 – Palec Feb 08 '14 at 22:52
  • https://help.github.com/articles/pushing-to-a-remote/ putting this link here for immediate help to novices like me – MycrofD Aug 04 '18 at 10:49

12 Answers12

1778

You can control the default behavior by setting push.default in your git config. From the git-config(1) documentation:

push.default

Defines the action git push should take if no refspec is given on the command line, no refspec is configured in the remote, and no refspec is implied by any of the options given on the command line. Possible values are:

  • nothing: do not push anything

  • matching: (default before Git 2.0) push all matching branches

    All branches having the same name in both ends are considered to be matching.

  • upstream: push the current branch to its upstream branch (tracking is a deprecated synonym for upstream)

  • current: push the current branch to a branch of the same name

  • simple: (new in Git 1.7.11, default since Git 2.0) like upstream, but refuses to push if the upstream branch's name is different from the local one

    This is the safest option and is well-suited for beginners.

The simple, current and upstream modes are for those who want to push out a single branch after finishing work, even when the other branches are not yet ready to be pushed out

Command line examples:

To view the current configuration:

git config push.default

To set a new configuration:

git config push.default current
CervEd
  • 3,306
  • 28
  • 25
Brian L
  • 10,757
  • 5
  • 19
  • 17
  • 11
    It's probably worth noting that this is new in v1.6.3: https://github.com/git/git/blob/master/Documentation/RelNotes/1.6.3.txt – CB Bailey Jun 04 '09 at 07:34
  • 11
    This "push.default" is the greatest thing ever for working with multiple repos. Set it to "tracking" and you are all good. Combined with branch --set-upstream these making push and pull way more convenient. – jpswain Sep 30 '10 at 04:22
  • 2
    According to the git doc 'git push origin HEAD' should also work. – Kutzi Mar 26 '11 at 10:31
  • 17
    "tracking" is the deprecated synonym for "upstream": http://www.kernel.org/pub/software/scm/git/docs/git-config.html – 0xPixelfrost Jun 09 '11 at 06:37
  • 1
    Note that the "upstream" (aka "tracking") setting may not necessarily push to the remote. Suppose you create a local *mybranch* from your local *master* and you have automatic tracking set up so that *master* is automatically set upstream of *mybranch*. Even after you create *origin/mybranch*, your local *mybranch* will still have your local *master* as its upstream branch, and that's what it'll push to. You'll need to use `git branch --set-upstream` to fix it. – Ryan Lundy Sep 12 '11 at 21:01
  • 2
    The `upstream` synonym isn't available in Git 1.7.0.4 (the version in Ubuntu 10.04 LTS). – Joey Adams Nov 16 '11 at 08:33
  • 1
    @Joey Adams: in 1.7.0.4 just use `tracking` (`upstream` does same as tracking in old versions). – Patrick Boos Dec 16 '11 at 03:04
  • Does anybody know if it is possible to change the default behaviour of the push command only in ONE SINGLE PUSH, that is, without having to edit the config file? Something like "git push origin --global push.default upstream" (I tried this and it did not work)?? – Bitcoin Cash - ADA enthusiast Oct 02 '12 at 22:29
  • 26
    It's worth noting that as of Git 1.7.11, there's a new `simple` mode. This mode is intended to become the default in future. `simple` works like `upstream`, but like `current` requires that the branch names are the same on both ends. – Kai Oct 14 '12 at 20:59
  • It's also worth noting that the config values here (upstream, current, etc) are not refspecs, and can't be combined with refspecs. For example, when I wanted to configure git to push the current branch and all tags on 'git push' I couldn't use push.default=current. Instead my .git/config file looks a bit like this: `[remote "origin"] url = git@bitbucket.org:my/repo.git push = refs/tags/*:refs/tags/* push = head` – Pathogen Feb 05 '14 at 00:03
  • 2
    @Tiago , you can push a single branch without modifying the config by explicitly naming it in your push options, for example `git push origin master:master`. – Brad Koch Feb 05 '14 at 20:36
  • 2
    I am wondering in which case "push.default=upstream" might be wrong. Kyralessa pointed out one example above, but this is an example which might not even be "wrong". So I am wondering why not always to use "push.default=upstream"; what could be wrong with that ? – Ingo Blackman Feb 09 '14 at 19:11
  • 1
    When `matching` is used, `git push` says `Everything up-to-date` if upstream is set to `.` or when branch of the same name does not exist in the remote. To push the branch into the remote repository, you have to use `git push `, e.g. `git push origin testing`. – Palec Feb 17 '14 at 22:43
  • 11
    It's worth noting that as of Git 2.0 the `simple` behaviour is now the default. – do0g Jul 24 '15 at 14:26
  • 2
    Default behaviour should be rather `nothing`, than `simple`. Don't let beginners make any mistakes,... (applies also to advanced users, which might overlook something,...) – kravemir Apr 05 '18 at 12:17
  • 9
    There is a lot `worth noting` – Chad Bingham Nov 15 '18 at 21:31
  • 5
    `git config --global push.default` didn't show anything for me. – user3731622 Jan 17 '19 at 18:01
  • also useful to know, regardless of `push.default` you can push all matching branches with eg, `git push origin :` – Jacob Dorman Feb 11 '20 at 02:09
  • 11 year old answer changed my life. – Adam Jenkins Apr 19 '21 at 18:07
  • 1
    Has nothing been `worth noting` since 2015? – mcalex Feb 24 '22 at 03:22
239

You can set up default behavior for your git with push.default

git config push.default current

or if you have many repositories and want the same for all then

git config --global push.default current

The current in this setup means that by default you will only push the current branch when you do git push

Other options are:

  • nothing : Do not push anything
  • matching : Push all matching branches (default)
  • tracking : Push the current branch to whatever it is tracking
  • current : Push the current branch

UPDATE - NEW WAY TO DO THIS

As of Git 1.7.11 do the following:

git config --global push.default simple

This is a new setting introduced that works in the same way as current, and will be made default to git from v 2.0 according to rumors

Christoffer
  • 7,436
  • 4
  • 40
  • 42
  • 30
    Yes I read the answer you are referring to, but that answer only tells what to do and not how to do it. So I added my answer so all the info needed to set it up is on the same page. – Christoffer Oct 11 '11 at 09:46
  • 3
    OK; it's better to suggest an edit to the said post, because nobody will see your answer, as it's not likely to get as many votes – CharlesB Oct 11 '11 at 09:56
  • how would one go about pulling to current branch? git pull origin? – Francois Oct 22 '12 at 12:36
209

git push origin will push all changes on the local branches that have matching remote branches at origin As for git push

Works like git push <remote>, where <remote> is the current branch's remote (or origin, if no remote is configured for the current branch).

From the Examples section of the git-push man page

davr
  • 18,877
  • 17
  • 76
  • 99
baudtack
  • 29,062
  • 9
  • 53
  • 61
  • 2
    Yep, that makes it clear. I'm probably running an older version of git (1.6.1.1 Mac OS X) which does not have these examples in the man page. – Debajit Jun 04 '09 at 03:53
  • Probably I'm running 1.6.3.1. I did find it on the site I linked however. – baudtack Jun 04 '09 at 03:56
  • 2
    So, in my case, where all the local branches have the same remote "origin", "git push" would be exactly the same as "git push origin" which would push only the local branches that have a corresponding branch in the remote. – Debajit Jun 04 '09 at 04:02
  • @Debajit Right on! Great question by the way. I had always assumed that git push would only push the current branch. Apparently not! Very good to know. – baudtack Jun 04 '09 at 04:28
  • 5
    This question is old but for anybody new, @docgnome is right. Just running 'git push origin' will push all of the branches instead of only the current branch. Use 'git push -f -v -n origin development' to force push a branch named development. Use the -n flag to simulate the git push result so you can see in advance which branch(es) will be affected. If it looks good then run 'git push -f -v origin development'. This might be useful http://stackoverflow.com/questions/3741136/git-push-f-vs – Dylan Valade Sep 19 '11 at 13:42
  • This answer was correct a long, long time ago, but is misleading now. Almost no users will have an old enough git version to default to `push.default=matching` behavior. – Tao Jan 13 '23 at 15:42
28

Here is a very handy and helpful information about Git Push: Git Push: Just the Tip

The most common use of git push is to push your local changes to your public upstream repository. Assuming that the upstream is a remote named "origin" (the default remote name if your repository is a clone) and the branch to be updated to/from is named "master" (the default branch name), this is done with: git push origin master

git push origin will push changes from all local branches to matching branches the origin remote.

git push origin master will push changes from the local master branch to the remote master branch.

git push origin master:staging will push changes from the local master branch to the remote staging branch if it exists.

Mukesh Chapagain
  • 25,063
  • 15
  • 119
  • 120
  • `git push origin branch_name` for some reason push not only `branch_name` branch, but also other my local branches (git version 1.9.1). – mrgloom Jul 14 '16 at 13:23
  • `git push origin master:staging` is an awesome hidden gem! – Shakeel Jan 16 '17 at 00:32
19

(March 2012)
Beware: that default "matching" policy might change soon
(sometimes after git1.7.10+)
:

See "Please discuss: what "git push" should do when you do not say what to push?"

In the current setting (i.e. push.default=matching), git push without argument will push all branches that exist locally and remotely with the same name.
This is usually appropriate when a developer pushes to his own public repository, but may be confusing if not dangerous when using a shared repository.

The proposal is to change the default to 'upstream', i.e. push only the current branch, and push it to the branch git pull would pull from.
Another candidate is 'current'; this pushes only the current branch to the remote branch of the same name.

What has been discussed so far can be seen in this thread:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Previous relevant discussions include:

To join the discussion, send your messages to: git@vger.kernel.org

VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
18

I just put this in my .gitconfig aliases section and love how it works:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

Will push the current branch to origin with git pub or another repo with git pub repo-name. Tasty.

Mat Schaffer
  • 1,634
  • 1
  • 15
  • 24
  • 4
    That is nice, but it unfortunately assumes that the branch has the same name on the other repository. Try `git push -u --repo="origin" $1;` instead. It works quite well, except if you push to another repository, the branch name will be the name used by the other repository, not the one you are pushing from – Casebash Jan 09 '12 at 07:11
  • Hey thanks! Makes me wanna do a more complete version that checks the tracking status before pushing. But I'll stick with mine for now since I rarely have different branch names between repos. – Mat Schaffer Jan 09 '12 at 16:22
18

You can push current branch with command

git push origin HEAD

(took from here)

Community
  • 1
  • 1
Andriy F.
  • 2,467
  • 1
  • 25
  • 23
  • this seems to be a good way to avoid retying long branch names to be able to push them to the remote the first time. `HEAD` is not too long to type and you don't change the default behaviour of git +1 – Eric Goerens Jan 03 '23 at 06:13
12

You can change that default behavior in your .gitconfig, for example:

[push]
  default = current

To check the current settings, run:

git config --global --get push.default
kenorb
  • 155,785
  • 88
  • 678
  • 743
9

A git push will try and push all local branches to the remote server, this is likely what you do not want. I have a couple of conveniences setup to deal with this:

Alias "gpull" and "gpush" appropriately:

In my ~/.bash_profile

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

Thus, executing "gpush" or "gpull" will push just my "currently on" branch.

Cody Caughlan
  • 32,456
  • 5
  • 63
  • 68
3

Rather than using aliases, I prefer creating git-XXX scripts so I can source control them more easily (our devs all have a certain source controlled dir on their path for this type of thing).

This script (called git-setpush) will set the config value for remote.origin.push value to something that will only push the current branch:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

note, as we're using Gerrit, it sets the target to refs/for/XXX to push into a review branch. It also assumes origin is your remote name.

Invoke it after checking out a branch with

git checkout your-branch
git setpush

It could obviously be adapted to also do the checkout, but I like scripts to do one thing and do it well

Mark Fisher
  • 9,838
  • 3
  • 32
  • 38
  • great idea setting remote.origin.push for gerrit usage. My local feature branches `feature/fix_fubar` are all pointed to more generic upstream branches like `master` or `develop`, so this would point at the wrong upstream. What's your local flow look like for gerrit controlled repos? – spazm Jun 24 '15 at 16:22
  • If you only have one "target" branch on gerrit, try simply `git config remote.origin.push HEAD:refs/for/master`. – fracz Jul 17 '15 at 08:22
2

I have added the following functions into my .bashrc file to automate these tasks. It does git push/git pull + name of current branch.

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
MichaelMoser
  • 3,172
  • 1
  • 26
  • 26
2

New config in git 2.37.0

Run to set auto setup remote instead of changing the push default behavior

git config --global --add --bool push.autoSetupRemote true

it works well with push.default is to simple, upstream

References: answer tweet docs commit