pull-only repo's 'git status' saying the branch is ahead of origin/master. Why?
Ok, so from the outset, you're doing everything correctly. I think the comment you added previously is a pretty good explanation:
In the simplest terms, "git pull" does a "git fetch" followed by a "git merge"
That's how I think of it. So you shouldn't have to call a git fetch
after a straight up git pull
- but, I can almost guarantee you, this works perfectly fine on anything EXCEPT the master
branch.
In one of the linked posts, it said to remove the following line:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this
And it should fix this issue - however, I cannot provide an explanation as to why this works. It's very hard to research, but I think that when you call fetch
, your git config actually specifies what exactly to grab. When you're running pull
, I'm not sure that it thinks the master
is synced.
I can guarantee you that if you did this from another non-master branch, you wouldn't see this problem. Hopefully one of the git gurus can explain the fetch
line in config in detail.
Furthermore, I would recommend running the following command instead which sets the HEAD for the remote repository to ensure it is in sync with your local one: git push -u origin master
Here's another interesting question:
Having a hard time understanding git-fetch
Ok, so I tested this on one of my workflows and found the following.
When you execute a git pull origin master
on your remote server, there's a file in the .git/
directory that references where your HEAD is at. Two files to take note of:
ORIG_HEAD
FETCH_HEAD
You'll notice that your FETCH_HEAD
is correct, but the ORIG_HEAD
shows the old commit, hence the reason you're getting the Ahead by x
. When you run git fetch
, you'll actually correct the reference in ORIG_HEAD
and everything is back to normal. I'm looking into how to change the fetch
line in the config to fix this behavior.
If you run a git pull origin
instead of a git pull origin master
, there won't be the issue with the Your branch is ahead of 'origin/master' by ... commits.
message.
Note: this question was recently linked-to from Git: unable to get remote and local/server the same. Note that the date on the original question is September 2011; the then-most-current version of Git was 1.7.10. Git is now at version 2.26.2.
In versions of Git predating Git 1.8.4, running git pull origin master
suppresses updating the local name origin/master
. (So does running git fetch origin master
.)
Running git fetch
, with no additional arguments, causes all versions of Git—before and after 1.8.4—to update all remote-tracking names, including origin/master
. So that's the real explanation behind this mystery.