Is there a special name (like HEAD, FETCH_HEAD) for the root commit on the current branch in a git repository?
I find myself referring to the root commit for various reasons. I usually make a tag 开发者_StackOverflow社区called first
or root
to make it easier, but I have been dealing with quite a few repositories lately and even this manual tagging is getting quite tedious.
Is there an easy way to refer to the root commit, something similar to HEAD
or FETCH_HEAD
?
To find SHA-1 identifiers of all root commits (starting with any local branch) in a git repository, you can use the following command:
$ git rev-list --parents --all | grep -v ' '
You can then use git show
to examine them.
Explanation: git rev-list
option --parents
makes it print space separated list of all parents of the commit (in the form "commit parent…"). Therefore if a commit has any parents, the line from git rev-list
invocation contains at least one space separating commit id from its parent id(s).
The option --all
means that git rev-list
works as if all the refs in refs/
are listed on the command line as <commit>.
I only see tagging that first commit relevant for you as the only current solution.
That way, you can refer to it through a well named tag instead of looking for its SHA1 through the log.
Note: there can be several "root" commits in a Git repo (i.e. several commits without any parent)
See for instance this thread, with Jakub Narębski's answer:
Not to mention that you can have multiple roots (multiple commits with no parent) in git repository.
Besides independent branches (like 'man
', 'html
' or 'todo
') it is usually result of absorbing or subtree-merging other projects.
In 'master
' branch there are 5 roots or more: joined 'git-tools
' (mailinfo
/mailsplit
), absorbedgitweb
, and subtree-mergedgitk
andgit-gui
.
Not so easy, but you can get the sha of the "root" that corresponds to HEAD (head's parent's parent's parent's ... parent until a commit is reached that has no parent) using
git rev-list --topo-order --reverse HEAD | head -n 1
Works for any commit actually. If there are multiple convergent paths of history, you'll get the root of the path that has the most commits in it.
I can't say that I see any use whatsoever for it, though. Most things that have any reason to traverse history an unlimited depth into the past already know how.
精彩评论