My understanding is that the default branch of a cloned repository is to be whatever HEAD points to in the repo being cloned.
I now have a case where this is not true. My understanding is obviously flawed, so what does determine the default checkout branch when cloning a (bare) repo?
The last commit on that repo was a merge between the branch referenced in the bare repo's HEAD into the branch I'm getting as the checkout branch in the clone.
Running git remote show origin
returns:
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
<bad-branch>
live
Remote branches:
...
Bare repo uses Git version 1.8.2.1, client uses 1.7.12.4, transport is SSH.
Maybe the answer is actually this one here. This answer confirms it. If there is a choice of symbolic refs all pointing to the same revision as HEAD, the client will guess which branch to use.
Beginning with Git 1.8.5, the server will send the actual branch name that HEAD
points to, in the "symref" capability. If you have both a client and server newer than Git 1.8.5, it will update HEAD
correctly.
Prior to that, the client will guess what HEAD may have pointed to by comparing the object ID that HEAD (ultimately) points to with all the object IDs of all the branches. It prefers a branch named refs/heads/master
: if both HEAD
and master
point to the same object ID, then clone will set the default branch in the new repository to master
.
Otherwise, the first branch with a matching OID (when the branches are sorted alphanumerically) will be the default branch. If no branches have matching OIDs, then HEAD
will be set directly to the object ID (ie, a detached HEAD).