How to diff one file to an arbitrary version in Git?
GitDiffGit DiffGit 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:
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.