Posted By: Milan Babuškov
I have a Git repository and I’d like to see how some files looked a few months ago. I found the revision at that date; it’s
27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8. I need to see what one file looks like, and also save it as a (“new”) file.
I managed to see the file using
gitk, but it doesn’t have an option to save it. I tried with command-line tools, the closest I got was:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
However, this command shows a diff, and not the file contents. I know I can later use something like
PAGER=cat and redirect output to a file, but I don’t know how to get to the actual file content.
Basically, I’m looking for something like svn cat.
To complete your own answer, the syntax is indeed
git show object git show $REV:$FILE git show somebranch:from/the/root/myfile.txt git show HEAD^^^:test/test.py
The command takes the usual style of revision, meaning you can use any of the following:
- branch name (as suggested by ash)
HEAD+ x number of
- The SHA1 hash of a given revision
- The first few (maybe 5) characters of a given SHA1 hash
Tip It’s important to remember that when using "
git show", always specify a path from the root of the repository, not your current directory position.
(Although Mike Morearty mentions that, at least with git 184.108.40.206, you can specify a relative path by putting "
./" at the beginning of the path. For example:
git show HEAD^^:./test.py
git restore -s <SHA1> -- afile git restore -s somebranch -- afile
That would restore on the working tree only the file as present in the "source" (
-s) commit SHA1 or branch
To restore also the index:
git restore -s <SHA1> -SW -- afile
-SW: short for
Using low-level git plumbing commands
Before git1.5.x, this was done with some plumbing:
git ls-tree <rev>
show a list of one or more ‘blob’ objects within a commit
git cat-file blob <file-SHA1>
cat a file as it has been committed within a specific revision (similar to svn
git ls-tree to retrieve the value of a given file-sha1
git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::
git-ls-tree lists the object ID for
$file in revision
$REV, this is cut out of the output and used as an argument to
git-cat-file, which should really be called
git-cat-object, and simply dumps that object to
Note: since Git 2.11 (Q4 2016), you can apply a content filter to the
git cat-file output.
commit 7bcf341 (09 Sep 2016),
commit 7bcf341 (09 Sep 2016), and
commit 16dcc29 (24 Aug 2016) by Johannes Schindelin (
(Merged by Junio C Hamano —
gitster — in commit 7889ed2, 21 Sep 2016)
git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" git cat-file --textconv --batch
git cat-file --textconv" started segfaulting recently (2017), which has been corrected in Git 2.15 (Q4 2017)