Pulling and pushing with git can be a bit verbose. This post explains how to get from git pull --rebase origin master
and git push origin master
to just typing git pull
and git push
.
Rebase
First, set rebase for every new upstream branch (Why rebase? It makes your history easier to understand.)
git config --global branch.autosetuprebase always
This is explained in more detail (and with other helpful hints) in Mislav Marohnić’s post A few git tips you didn’t know about.
Tracking
Second, make git push
only send the current branch to its matching upstream (aka tracking) branch. (Otherwise the default behavior is to push all branches that have the same name on both ends.)
git config --global push.default upstream
This is covered in some detail in Mark Longhair’s post An asymmetry between git pull and push.
On any existing branches, you can set up tracking by doing an explicit push:
git push -u origin branchname
Default refspec
At this point you should be set according to all the tutorials I came across. In my experience, however, this only works for branches other than master. A plain git push
on master yields the error:
fatal: The current branch master has multiple upstream branches, refusing to push.
The solution is to set the default refspec for git push. I’m unclear on why this needed for master but not for other branches.
git config remote.origin.push HEAD
the last line
git config remote.origin.push = HEAD
should be changed to
git config remote.origin.push HEAD
I also don’t know why it works, but it fixed the same error for me on master.
Thanks for pointing that out, Joris. I’ve updated the post.
The reason is that you probably have an upstream reference for master in your `~/.gitconfig` like this
[branch "master"]
remote = origin
merge = refs/heads/master
and the same in your `.git/config`. Removing one of them solves the problem. See http://stackoverflow.com/a/18404770/396967.