在Git中,如何在同一个分支(例如master)上的两个不同提交(不是连续的)之间比较相同的文件?

我正在寻找一个类似于Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的比较功能。 在Git中可以吗?


当前回答

这只是另一种使用Git的方式……

git difftool HEAD HEAD@{N} /PATH/FILE.ext

其他回答

下面是一个Perl脚本,它打印出在Git日志命令中找到的给定文件的Git diff命令。

E.g.

git log pom.xml | perl gldiff.pl 3 pom.xml

收益率:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

然后可以在shell窗口会话中剪切和粘贴,或者通过管道传输到/bin/sh。

注:

数字(在本例中为3)指定要打印多少行 该文件(在本例中为pom.xml)在两个位置必须一致(可以将其包装在shell函数中以在两个位置提供相同的文件),或者将其作为shell脚本放在二进制目录中

代码:

# 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;
}

如果你有几个文件或目录,想要比较非连续提交,你可以这样做:

创建临时分支(本例中为“revision”)

git checkout -b revision

倒回到第一个提交目标

git reset --hard <commit_target>

对那些有兴趣的人挑刺

git cherry-pick <commit_interested> ...

应用比较

git diff <commit-target>^

当你完成时

git branch -D revision

这只是另一种使用Git的方式……

git difftool HEAD HEAD@{N} /PATH/FILE.ext

来自git-diff manpage:

git diff [--options] <commit> <commit> [--] [<path>...]

例如,要查看文件“main.c”在现在和两次提交之间的区别,这里有三个等效的命令:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

如果希望在每次提交的基础上查看两次提交之间对文件的所有更改,也可以这样做

Git log -u $start_commit..$end_commit——path/to/file