How do I diff the same file between two different commits on the same branch?
In Git, how could I compare the same file between two different commits (not contiguous) on the same branch (master for example)?
I'm searching for a compare feature like the one in Visual SourceSafe (VSS) or Team Founda开发者_运维知识库tion Server (TFS).
Is it possible in Git?From the git-diff
manpage:
git diff [--options] <commit> <commit> [--] [<path>...]
For instance, to see the difference for a file "main.c" between now and two commits back, here are three equivalent commands:
$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
You can also compare two different files in two different revisions, like this:
git diff <revision_1>:<file_1> <revision_2>:<file_2>
If you have configured the "difftool" you can use
git difftool revision_1:file_1 revision_2:file_2
Example: Comparing a file from its last commit to its previous commit on the same branch: Assuming that if you are in your project root folder
$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java
You should have the following entries in your ~/.gitconfig or in project/.git/config file. Install the p4merge.
[merge]
tool = p4merge
keepBackup = false
[diff]
tool = p4merge
keepBackup = false
[difftool "p4merge"]
path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
keepBackup = false
[difftool]
keepBackup = false
[mergetool "p4merge"]
path = C:/Program Files (x86)/Perforce/p4merge.exe
cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
Note: If you are using Intellij Enterprise or Community Edition - It has a good tool for doing 3 way merge when doing a merging/rebasing
For simple diff you can right click->Git->Compare with revision
Select the revision you are interested in
Intellij will show the diff.
Check $ git log
, copy the SHA-1 ID of the two different commits, and run the git diff
command with those IDs. for example:
$ git diff (sha-id-one) (sha-id-two)
If you want to see all changes to the file between the two commits on a commit-by-commit basis, you can also do
git log -u $start_commit..$end_commit -- path/to/file
Here is a Perl script that prints out Git diff commands for a given file as found in a Git log command.
E.g.
git log pom.xml | perl gldiff.pl 3 pom.xml
Yields:
git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml
which could then be cut and pasted in a shell window session or piped to /bin/sh
.
Notes:
- the number (3 in this case) specifies how many lines to print
- the file (pom.xml in this case) must agree in both places (you could wrap it in a shell function to provide the same file in both places) or put it in a binary directory as a shell script
Code:
# gldiff.pl
use strict;
my $max = shift;
my $file = shift;
die "not a number" unless $max =~ m/\d+/;
die "not a file" unless -f $file;
my $count;
my @lines;
while (<>) {
chomp;
next unless s/^commit\s+(.*)//;
my $commit = $1;
push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
if (@lines == 2) {
printf "git diff %s %s\n", @lines;
@lines = ();
}
last if ++$count >= $max *2;
}
If you have several files or directories and want to compare non continuous commits, you could do this:
Make a temporary branch ("revision" in this example)
git checkout -b revision
Rewind to the first commit target
git reset --hard <commit_target>
Cherry picking on those commit interested
git cherry-pick <commit_interested> ...
Apply diff
git diff <commit-target>^
When you done
git branch -D revision
If you want to make a diff with more than one file, with the method specified by @mipadi:
E.g. diff between HEAD
and your master
, to find all .coffee
files:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
This will recursively search your your_search_folder/
for all .coffee
files and make a diff between them and their master
versions.
Just another way to use Git's awesomeness...
git difftool HEAD HEAD@{N} /PATH/FILE.ext
All the other responses are more complete, so upvote them. This one is just to remember that you can avoid knowing the id of the recent commit. Usually, I set my self in the branch that I want to compare and run diff tools knowing the old commit uid (You can use other notations):
git checkout master
git difftool 6f8bba my/file/relative/path.py
Also, check this other response here to set the tool you want git open to compare the file: Configuring diff tool with .gitconfig And to learn more about difftool, go to the difftool doc
If you want a simple visual comparison on Windows such as you can get in Visual SourceSafe or Team Foundation Server (TFS), try this:
- right-click on the file in File Explorer
- select 'Git History'
Note: After upgrading to Windows 10 I have lost the Git context menu options. However, you can achieve the same thing using 'gitk' or 'gitk filename' in a command window.
Once you call 'Git History', the Git GUI tool will start, with a history of the file in the top left pane. Select one of the versions you would like to compare. Then right-click on the second version and choose either
Diff this -> selected
or
Diff selected -> this
Colour-coded differences will appear in the lower left-hand pane.
精彩评论