在Git中,如何在同一个分支(例如master)上的两个不同提交(不是连续的)之间比较相同的文件?
我正在寻找一个类似于Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的比较功能。 在Git中可以吗?
在Git中,如何在同一个分支(例如master)上的两个不同提交(不是连续的)之间比较相同的文件?
我正在寻找一个类似于Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的比较功能。 在Git中可以吗?
当前回答
来自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
其他回答
如果你想对多个文件进行diff,使用@mipadi指定的方法:
例如,HEAD和master之间的差异,找到所有的。coffee文件:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
这将递归搜索your_search_folder/所有的.coffee文件,并在它们和它们的主版本之间做出区别。
如果你想在Windows上进行简单的可视化比较,比如你可以在visual SourceSafe或Team Foundation Server (TFS)中获得,试试这个:
在文件资源管理器中右键单击该文件 选择“Git历史记录”
注意:升级到Windows 10后,我失去了Git上下文菜单选项。但是,您可以在命令窗口中使用'gitk'或'gitk filename'来实现相同的功能。
一旦你调用'Git History', Git GUI工具将启动,文件的历史记录在左上方窗格中。选择一个您想要比较的版本。然后右键单击第二个版本并选择其中之一
Diff this ->被选中
or
Diff selected -> this
颜色编码的差异将出现在左下角的窗格中。
来自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
下面是一个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;
}