What is the difference between “git show test.rb” and “git show HEAD:test.rb”?
Question
Could you explain the difference between git show test.rb
and git show HEAD:test.rb
?
The command git show HEAD:test.rb
returns:
test file contents
while git show test.rb
returns:
commit a8e90b3dbf4eed03cdbb3cd3b99f98e9153c7219
Author: Misha Moroshko <michael.moroshko@gmail.com>
Date: Thu Oct 27 17:03:04 2011
+1100
asd
diff --git a/test.rb b/test.rb new file mode 100644 index
0000000..b48e119
--- /dev/null
+++ b/test.rb @@ -0,0 +1 @@
+test file contents
Solution
git show
for commits will show the log message and textual diff. So that is what you get when you do git show
, with the commit being assumed to be HEAD. And git show file
shows the log message and textual diff for HEAD, filtered to file
.
To show the content of the files at a particular commit, you do git show commit:file
. So the git show HEAD:file
shows the contents of the file in HEAD.
From gitrevisions
man page:
A suffix : followed by a path (e.g. HEAD:README); this names the blob or tree at the given path in the tree-ish object named by the part before the colon. :path (with an empty part before the colon, e.g. :README) is a special case of the syntax described next: content recorded in the index at the given path.
Also refer to the examples in the git show manual ( git show --help
)
OTHER TIPS
git show test.rb
can be rewritten as git show -- test.rb
. This form makes it more obvious that you're calling git show
and filtering the output to just test.rb
. Since git show
defaults to showing HEAD
, this is the same as git show HEAD -- test.rb
. Basically, it will show the commit info, but only give you a diff for the specific file test.rb
.
However, git show HEAD:test.rb
is explicitly instructing git show
that the object you want to show is the blob that lives at the path test.rb
reachable from the tree associated with the HEAD
commit.