What determines default branch after "git clone"?
Solution 1:
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).
Solution 2:
It is actually what HEAD points to. Use git symbolic-ref HEAD refs/heads/mybranch
for setting HEAD.
(source: http://feeding.cloud.geek.nz/posts/setting-default-git-branch-in-bare/ )
Solution 3:
A bare repo has a HEAD
, too. That's what you get when you clone it.
From the git clone
documentation:
Clones a repository into a newly created directory, creates remote-tracking branches for each branch in the cloned repository (visible using
git branch -r
), and creates and checks out an initial branch that is forked from the cloned repository's currently active branch.
The bit about "currently active branch" is referring to the remote's HEAD
revision.
If you want different behaviour, you can use --branch
or -b
:
--branch <name>
-b <name>
Instead of pointing the newly createdHEAD
to the branch pointed to by the cloned repository’sHEAD
, point to<name>
branch instead. In a non-bare repository, this is the branch that will be checked out.--branch
can also take tags and detaches theHEAD
at that commit in the resulting repository.
Solution 4:
It's origin/HEAD
. However if you want the name like 'origin/master' you'd have to parse the file like this
cat .git/refs/remotes/origin/HEAD | awk '{ print $2 }'