Another public service announcement about Git.
There are a number of commands everyone learns when they first start out using Git. And there are some that almost nobody learns right away, but that should be the first thing you learn once you get comfortable using Git day to day.
One of these has the uninteresting-sounding name git-rev-parse
. Git
has a bewildering variety of notations for referring to commits and
other objects. If you type something like origin/master~3
, which
commit is that? git-rev-parse
is your window into Git's
understanding of names:
% git rev-parse origin/master~3
37f2bc78b3041541bb4021d2326c5fe35cbb5fbb
A pretty frequent question is: How do I find out the commit ID of the current HEAD? And the answer is:
% git rev-parse HEAD
2536fdd82332846953128e6e785fbe7f717e117a
or if you want it abbreviated:
% git rev-parse --short HEAD
2536fdd
But more important than the command itself is the manual for the command. Whether you expect to use this command, you should read its manual. Because every command uses Git's bewildering variety of notations, and that manual is where the notations are completely documented.
When you use a ref name like master
, Git finds it in
.git/refs/heads/master
, but when you use origin/master
, Git finds
it in .git/refs/remotes/origin/master
, and when you use HEAD
Git
finds it in .git/HEAD
. Why the difference? The git-rev-parse
manual explains what Git is doing here.
Did you know that if you have an annoying long branch name like
origin/martin/f42876-change-tracking
you can create a short alias
for it by sticking
ref: origin/martin/f42876-change-tracking
into .git/CT
, and from then on you can do git log CT
or git
rebase --onto CT
or whatever?
Did you know that you can write topic@{yesterday}
to mean “whatever
commit topic
was pointing to yesterday”?
Did you know that you can write ':/penguin system'
to refer to the most
recent commit whose commit message mentions the penguin system, and
that 'HEAD:/penguin system'
means the most recent such commit on the
HEAD
branch?
Did you know that there's a powerful sublanguage for ranges that you can
give to git-log
to specify all sorts of useful things about which
commits you want to look at?
Once I got comfortable with Git I got in the habit of rereading the
git-rev-parse
manual every few months, because each time I would
notice some new useful tool.
Check it out. It's an important next step.
[ Previous PSAs:
- Two things (beginners ought to know) about Git
- Git remote branches and Git's missing terminology
- Git's rejected push error
]