What does git rev-parse do?
Asked Answered
A

4

477

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?

Anglesite answered 3/4, 2013 at 21:53 Comment(5)
As far as I can see in the man page, it's a mostly internal utility to parse revision/object names for other commands. What you're doing is pretty much the purpose of the rev-parse command. You can also use it to normalize a command line, so that the actual program doesn't have to understand the complicated object name syntax of Git (you'd use git rev-parse to change, or "massage", certain parameters in the command line before the actual program is called).Helles
See also github.com/git/git/commit/…Dumb
The man page for git rev-parse is laughably incomprehensible. I'm surprised nobody has bothered to rewrite that jargon into something human readable, even after 5 years.Tensible
@Tensible Me: 'Thank you for clarifying, I was feeling inferior.' Linus Torvalds: 'I re-read it, exactly what part did you not comprehend?'Zenas
Nobody can rewrite it if nobody can understand itEusporangiate
M
380

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 .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 to getopt) and print an output string that can be used with eval

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 for git log or git diff into the equivalent arguments for the underlying plumbing command as B ^A
Maros answered 4/4, 2013 at 4:3 Comment(0)
B
188

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.

Banderole answered 31/1, 2015 at 7:34 Comment(5)
Thanks for the explanation, I didn't understand the git-docs one bit: git-scm.com/docs/git-rev-parseMelanie
can you give us an example of messaging and manipulation as you allude to before?Vincent
In other words, git rev-parse is short for git revision-parse. It takes the given input and returns the corresponding 40-character revision ID.Tobacco
git doc itself is like plumbing, and this answer is the porcelain.Buckwheat
Wow, it turns out that git rev-parse is actually extremely simple to understand. Why is the manual page written in such hieroglyphics?Pansy
G
63

git rev-parse Also works for getting the current branch name using the --abbrev-ref flag like:

git rev-parse --abbrev-ref HEAD
Granary answered 27/12, 2016 at 18:33 Comment(3)
Is it popssible to get a commit message in this way?Manado
@LeoDroidcoder try git log --format=%B -n 1 <revision>Strangury
Any way to ensure this is actually a branch?Glyn
P
27

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>

Pocketknife answered 18/6, 2021 at 8:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.