在Git中,如何在同一个分支(例如master)上的两个不同提交(不是连续的)之间比较相同的文件?
我正在寻找一个类似于Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的比较功能。 在Git中可以吗?
在Git中,如何在同一个分支(例如master)上的两个不同提交(不是连续的)之间比较相同的文件?
我正在寻找一个类似于Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的比较功能。 在Git中可以吗?
当前回答
如果你已经配置了“扩散工具”,你可以使用
git difftool revision_1:file_1 revision_2:file_2
示例:比较一个文件在同一个分支上的上一次提交和上一次提交: 假设您在项目根文件夹中
$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java
在~/中应该有以下条目。Gitconfig或在project/中。git /配置文件。安装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\"
注意:如果你使用的是Intellij企业版或社区版——它有一个很好的工具,可以在合并/重基时进行3路合并
对于简单的差异,您可以右键单击->Git->比较与修订
选择您感兴趣的修订版本
Intellij将显示差异。
其他回答
你也可以比较两个不同版本的文件,如下所示:
Git diff <revision_1>:<file_1> <revision_2>:<file_2>
其他的回答都比较完整,给它们点赞吧。 这只是为了记住,您可以避免知道最近提交的id。通常,我将自己设置在我想要比较的分支中,并运行diff工具,知道旧的提交uid(你可以使用其他符号):
git checkout master
git difftool 6f8bba my/file/relative/path.py
另外,检查这里的其他响应来设置你想要git打开的工具来比较文件: 使用.gitconfig配置diff工具 要了解更多关于difftool的知识,请访问difftool文档
来自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
下面是一个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