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.
git push
, which might be of interest
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
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
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
From the Examples section of the git-push
man page
I just committed my code to a branch and pushed it to github, like this:
git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments
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.
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).
git push origin master:staging
is an awesome hidden gem!
(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:
http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541
http://thread.gmane.org/gmane.comp.version-control.git/166743
To join the discussion, send your messages to: git@vger.kernel.org
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.
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
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
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.
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
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?
git config remote.origin.push HEAD:refs/for/master
.
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
}
Success story sharing
simple
mode. This mode is intended to become the default in future.simple
works likeupstream
, but likecurrent
requires that the branch names are the same on both ends.simple
behaviour is now the default.