Michal Vašut
Michal Vašut

Reputation: 355

How can I get what is the revision of file in Git

Is there any way to get revision (ie commit hash) of the file in Git?

I know about git log -- <file_path>), but that gives me all commits (or the last one if I do git log -1 -- <file_path>), but that's not what I want. Lets have FILE with commits A,B,C,D,E where E is HEAD now I'll do something like this

git checkout C -- FILE

Now if I do git status, it shows me that the FILE is modified and needs to be committed - what I don't want to do. (I have simple history viewer in my app and need to mark revision of the file after the checkout).

Is there any way to make Git show me current revision (in this case commit C)?

SVN can do this by svn info <file_name>, but SVN is not Git and works differently.

Edit:

in SVN:

svn info FILE // gives me revision E
svn update -r C
svn info File // gives me revision C

EDIT2: Real world example:

$ git log --pretty=format:"%H ... %h ... %s" -- MySQL\ 5_5.txp
131b81c2a203c564c01b4fffa98b7395ebb75bc2 ... 131b81c ... modified MYSql5.5
2640738310efa21f119cdcb252cc5069aade27bd ... 2640738 ... Changed Entity 2     position
bbe9b2474b3f0127da0271b4db74712c201c2c03 ... bbe9b24 ... Changed Entity 3 position
c40c5f74599515d95b17641a58c2864a34b20f06 ... c40c5f7 ... from popup
ac46fa7d4d93e91183a033ce8fffcf93d9f0505d ... ac46fa7 ... from toolbar
248824ec7f4fda13ca28358d7b50a810b2d247f9 ... 248824e ... sdsada
20103e2c1798cee2816eb78967cdb6443bd1f9bf ... 20103e2 ... mysql
e222f54962b9b12745b0c1904b70f1ee9c657d2e ... e222f54 ... ssss
fd8f3b34a86851f54cf2951cb4d3077e4ffa16ba ... fd8f3b3 ... ssss
c979f4cba91564333fa81e62dce328c23c38b739 ... c979f4c ... ccccccccccc
9a5a8e08c016a27b7d818c8e6828dd5dd578a00c ... 9a5a8e0 ... divny commit
61c8146060d1db337888d7bca83db1bacb441158 ... 61c8146 ... edwdewd
d495e292bb917fe730143af5b40c612a6937eaea ... d495e29 ... wqewqe
459d7938df6273bc4b8a4f3aa6a41e0d318a291d ... 459d793 ... wqwewqe
6f993b23ec79350c57f75375e3640d5079d8b873 ... 6f993b2 ... aaaaaaaa
7c9e43cda6ce44d4e614a42637b3334de4813059 ... 7c9e43c ... ddwedwe
ea419227ad22058625aadd08aa7e9227063568ee ... ea41922 ... edwd
2c08393f0696d443ab5ad8b75d74093d59caf76f ... 2c08393 ... mysql

$ git checkout e222f54 MySQL\ 5_5.txp


$ git rev-parse HEAD:MySQL\ 5_5.txp
ba5ee499030a097fbc20eeddde003820d58a5754

I would expect something like:

$ git <some command> [options] MySQL\ 5_5.txp

to return e222f54 or fulhash e222f54962b9b12745b0c1904b70f1ee9c657d2e

Upvotes: 0

Views: 461

Answers (2)

user7018603
user7018603

Reputation:

This shell script should work, just pass file name as an argument:

#!/bin/sh

blob=`git hash-object $1`

git log --format=format:%H --follow $1 |
while read commit; do
    if git ls-tree -r $commit | grep -q $blob; then
        echo $commit; break;
    fi
done
  1. git hash-object $1 calculates hash for currently checked out file $1
  2. git log --format=format:%H --follow $1 lists hashes for all commits which introduced any change to file $1
  3. git ls-tree -r $commit | grep -q $blob; finds which commit from step 2 has file $1 with the same hash as calculated in step 1

Upvotes: 1

LeGEC
LeGEC

Reputation: 52226

To view FILE's content in commit C without checking it out :

git show C:FILE

# you can redirect the output to a file on your disk :
git show C:FILE > /tmp/FILE

If you want to view the diff between C and HEAD versions of FILE :

git diff C -- FILE

# you can ask git to open a graphical diff viewer :
git difftool C -- FILE

Upvotes: 0

Related Questions