How to diff one file to an arbitrary version in Git?

GitDiffGit Diff

Git Problem Overview


How can I diff a file, say pom.xml, from the master branch to an arbitrary older version in Git?

Git Solutions


Solution 1 - Git

You can do:

git diff master~20:pom.xml pom.xml

... to compare your current pom.xml to the one from master 20 revisions ago through the first parent. You can replace master~20, of course, with the object name (SHA1sum) of a commit or any of the many other ways of specifying a revision.

Note that this is actually comparing the old pom.xml to the version in your working tree, not the version committed in master. If you want that, then you can do the following instead:

git diff master~20:pom.xml master:pom.xml

Solution 2 - Git

git diff <revision> <path>

For example:

git diff b0d14a4 foobar.txt

Solution 3 - Git

If you want to see the difference between the last commit of a single file you can do:

git log -p -1 filename

This will give you the diff of the file in git, is not comparing your local file.

Solution 4 - Git

To see what was changed in a file in the last commit:

git diff HEAD~1 path/to/file

You can change the number (~1) to the n-th commit which you want to diff with.

Solution 5 - Git

Generic Syntax :

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

for all files named "FileName.xml" anywhere in your repo.

Notice the space between "--" and "**"

Answer for your question:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

as always with git, you can use a tag/sha1/"HEAD^" to id a commit.

Tested with git 1.9.1 on Ubuntu.

Solution 6 - Git

If neither commit is your HEAD then bash's brace expansion proves really useful, especially if your filenames are long, the example above:

git diff master~20:pom.xml master:pom.xml

Would become

git diff {master~20,master}:pom.xml

More on Brace expansion with bash.

Solution 7 - Git

For comparing to 5 commit to the current one, both on master, just simply do:

git diff master~5:pom.xml master:pom.xml

Also you can refer to commit hash number, for example if the hash number is x110bd64, you can do something like this to see the difference:

git diff x110bd64 pom.xml

Solution 8 - Git

git diff -w HEAD origin/master path/to/file

Solution 9 - Git

git diff master~20 -- pom.xml

Works if you are not in master branch too.

Solution 10 - Git

If you are fine using a graphical tool (or even prefer it) you can:

gitk pom.xml

In gitk you can then click any commit (to "select" it) and right click any other commit to select "Diff this -> selected" or "Diff selected -> this" in the popup menu, depending on what order you prefer.

Solution 11 - Git

For people interested in doing the same from GitHub, see comparing commits across time.

Solution 12 - Git

If you need to diff on a single file in a stash for example you can do

git diff stash@{0} -- path/to/file

Solution 13 - Git

If you are looking for the diff on a specific commit and you want to use the github UI instead of the command line (say you want to link it to other folks), you can do:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

For example:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

Note the Previous and Next links at the top right that allow you to navigate through all the files in the commit.

This only works for a specific commit though, not for comparing between any two arbitrary versions.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChris KView Question on Stackoverflow
Solution 1 - GitMark LongairView Answer on Stackoverflow
Solution 2 - GitBenjamin PollackView Answer on Stackoverflow
Solution 3 - GitGerardoView Answer on Stackoverflow
Solution 4 - GitJuampy NRView Answer on Stackoverflow
Solution 5 - Gituser5772635View Answer on Stackoverflow
Solution 6 - GitrobstarbuckView Answer on Stackoverflow
Solution 7 - GitAlirezaView Answer on Stackoverflow
Solution 8 - GitCatalinBertaView Answer on Stackoverflow
Solution 9 - GitGunar GessnerView Answer on Stackoverflow
Solution 10 - GitMartin GView Answer on Stackoverflow
Solution 11 - GitSkippy le Grand GourouView Answer on Stackoverflow
Solution 12 - GitlacostenycoderView Answer on Stackoverflow
Solution 13 - GitSchmickView Answer on Stackoverflow