The question is what are you pushing, and to where:
-
current
:- “what” is only your current branch (no other branches),
- “to where” is a branch of the same name (created if it doesn’t exist) in the upstream repo.
-
upstream
:- “what” is also only the current branch,
- “to where” is to whatever branch (not necessarily of the same name) on the upstream repo has been assigned as an upstream branch for the local branch you are pushing.
As explained here, Git2.0 will additionally introduce a new default for push.default
: simple
simple
is like upstream
, but the upstream has to have the same name as well or the push will fail.
Pushing only one branch (with the mode “simple
“, “current
” or “upstream
“) avoids the scenario where all matching branches are pushed (mode “matching
“, which was the default for a long time), even though some of your branches might not be ready to be pushed.
(master)> git push
...
To git@github.com:jkubicek/my_proj.git
21b430d..dd378ca master -> master
! [rejected] release -> release (non-fast-forward)
error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart.
hint: If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.
The difference between the two (current
and upstream
) is in the pull (what to pull from the remote to your branch?):
-
pushing “
current
” doesn’t mean that your current branchB
hasremote/B
has its upstream branch.
Ie:branch.B.merge
isn’t set, when your are pushing the “current
” branch.
Ie: when pulling toB
, git won’t know what branch to pull. -
pushing “
upstream
” means that your current branchB
hasremote/B
has its upstream branch.
Ie:branch.B.merge
is set, when your are pushing the “upstream
” branch.
Ie: when pulling toB
, git knows what branch to pull (as well as which remote repo:branch.B.remote
)