What does git rev-parse do?
What does git rev-parse
do?
I have read the man page but it raised more questions than answers. Things like:
Pick out and massage parameters
Massage? What does that mean?
I'm using as a resolver (to SHA1) of revision specifiers, like
git rev-parse HEAD^
or
git rev-parse origin/master
Is this the command’s purpose? If not, is even correct to use it to achieve this?
Solution 1:
git rev-parse
is an ancillary plumbing
command primarily used for manipulation.
One common usage of git rev-parse
is to print the SHA1 hashes given a revision specifier. In addition, it has various options to format this output such as --short
for printing a shorter unique SHA1.
There are other use cases as well (in scripts and other tools built on top of git) that I've used for:
-
--verify
to verify that the specified object is a valid git object. -
--git-dir
for displaying the abs/relative path of the the.git
directory. - Checking if you're currently within a repository using
--is-inside-git-dir
or within a work-tree using--is-inside-work-tree
- Checking if the repo is a bare using
--is-bare-repository
- Printing SHA1 hashes of branches (
--branches
), tags (--tags
) and the refs can also be filtered based on the remote (using--remote
) -
--parse-opt
to normalize arguments in a script (kind of similar togetopt
) and print an output string that can be used witheval
Massage
just implies that it is possible to convert the info from one form into another i.e. a transformation command. These are some quick examples I can think of:
- a branch or tag name into the commit's SHA1 it is pointing to so that it can be passed to a plumbing command which only accepts SHA1 values for the commit.
- a revision range
A..B
forgit log
orgit diff
into the equivalent arguments for the underlying plumbing command asB ^A
Solution 2:
Just to elaborate on the etymology of the command name rev-parse
, Git consistently uses the term rev
in plumbing commands as short for "revision" and generally meaning the 40-character SHA1 hash for a commit. The command rev-list
for example prints a list of 40-char commit hashes for a branch or whatever.
In this case the name might be expanded to parse-a-commitish-to-a-full-SHA1-hash
. While the command has the several ancillary functions mentioned in Tuxdude's answer, its namesake appears to be the use case of transforming a user-friendly reference like a branch name or abbreviated hash into the unambiguous 40-character SHA1 hash most useful for many programming/plumbing purposes.
I know I was thinking it was "reverse-parse" something for quite a while before I figured it out and had the same trouble making sense of the terms "massaging" and "manipulation" :)
Anyway, I find this "parse-to-a-revision" notion a satisfying way to think of it, and a reliable concept for bringing this command to mind when I need that sort of thing. Frequently in scripting Git you take a user-friendly commit reference as user input and generally want to get it resolved to a validated and unambiguous working reference as soon after receiving it as possible. Otherwise input translation and validation tends to proliferate through the script.
Solution 3:
git rev-parse
Also works for getting the current branch name using the --abbrev-ref flag like:
git rev-parse --abbrev-ref HEAD
Solution 4:
TLDR:
It helps you to find out the commit ID of the current HEAD (i.e. the current commit you are viewing)
git rev-parse HEAD
OR if you want the shorter commit
git rev-parse --short HEAD
If you want to find the latest commit in another branch, you can do
git rev-parse <local-branch-name>
git rev-parse origin/<remote-branch-name>