I have a local repository that pulls from a remote one. Running git pull as well as git fetch; git merge FETCH_HEAD used to perform exactly the same action, as is expected from the description of git pull:
DESCRIPTION
Incorporates changes from a remote repository into the current branch. In its default mode, git pull is shorthand for git fetch followed by git merge FETCH_HEAD.
Presently, and unexpectedly, running git fetch stopped updating the FETCH_HEAD reference correctly. FETCH_HEAD is now stuck to an old commit. Running git fetch downloads all changes to remote tracked branches, but FETCH_HEAD remains unchanged regardless of the branch in which it is run.
# currently in branchone
> git fetch
# branchone is up to date since...
> git rev-parse branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c
# ...its in the same commit as the remote branch
> git rev-parse origin/branchone
593539e8a98ba5980d4b645db3b0f506bb9b6a2c
# however FETCH_HEAD shows something different
> git rev-parse FETCH_HEAD
37301df96597ac037f8e7e846fea6fc7df77bea5
git pull still performs the correct task. However running git fetch; git merge FETCH_HEAD will do something different since FETCH_HEAD points to an incorrect commit.
Is there any setting or issue that could be messing with git fetch behavior?
Running
git fetchwithout any options will fetch all references in the remotes and write them to the.git/FETCH_HEADfile. The contents of the file usualy looks something like this:When you have a file like this under the
.gitdirectory, you can use it as a reference as long as the first thing in that file is either a 40 character hex number, or a shorter hex number that actualy matches to an existing commit.Knowing this we can see that after running
git fetchthe referenceFETCH_HEADwill resolve to is whatever happens to be in that first lineSeems like the order of the contents of
.git/FETCH_HEADis not guaranteed to contain first the reference for the current branch.By trying it in different repositories it seems that in some the first line is always the current branch, and thus
git fetch; git merge FETCH_HEADworks as expected. On other repositories however the contents of.git/FETCH_HEADwill be ordered differently and often the first line will be a reference to the remote commit of a different branch, thus making theFETCH_HEADreference incorrect.Why it behaves differently is a mystery to me.
As a solution, if
git fetch remote_name branch_nameis used only this specific branch is fetched and only that single line will appear in the contents of.git/FETCH_HEAD, making theFETCH_HEADreference always correct.