如何在同一分支上的两个不同提交之间区分同一个文件?

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

我正在搜索比较功能,例如Visual SourceSafe(VSS)或Team Foundation Server(TFS)中的功能。
在Git中可以吗?

980484 次浏览

#0 manpage:

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

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

$ 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

您还可以比较两个不同版本中的两个不同文件,如下所示:

git diff <revision_1>:<file_1> <revision_2>:<file_2>

如果您已经配置了“扩散工具”,则可以使用

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/config文件中包含以下条目。安装p4合并。

[merge]tool = p4mergekeepBackup = false[diff]tool = p4mergekeepBackup = 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.execmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

注意:如果您使用的是Intellij Enterprise或Community Edition-它有一个很好的工具,可以在进行合并/重设时进行3路合并

对于简单的diff,您可以右键单击->Git->比较版本输入图片描述

选择您感兴趣的版本

输入图片描述

Intellij将显示差异。

输入图片描述

选中$ git log,复制两个不同提交的SHA-1 ID,并使用这些ID运行git diff命令。例如:

$ git diff (sha-id-one) (sha-id-two)

只是另一种使用Git令人敬畏的方式…

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

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

创建一个临时分支(本例中为修改

git checkout -b revision

倒回到第一个提交目标

git reset --hard <commit_target>

樱桃采摘那些承诺感兴趣

git cherry-pick <commit_interested> ...

应用diff

git diff <commit-target>^

当你完成

git branch -D revision

如果您想使用多个文件进行diff,请使用@mipadi指定的方法:

例如。在HEADmaster之间进行差异,以查找所有.coffee文件:

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

这将递归搜索所有.coffee文件的your_search_folder/,并在它们和它们的master版本之间进行差异。

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

例如。

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

产量:

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

然后可以将其剪切并粘贴到shell窗口会话中或通过管道传输到/bin/sh

备注:

  1. 数字(在本例中为3)指定要打印多少行
  2. 文件(pom.xml在这种情况下)必须在两个地方一致(您可以将其包装在shell函数中以在两个地方提供相同的文件)或将其作为外壳脚本放在二进制目录中

代码:

# gldiff.pluse 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;}

如果您想在Windows上进行简单的视觉比较,例如您可以在Visual SourceSafeTeam Foundation Server(TFS)中获得,请尝试以下操作:

  • 右键单击文件资源管理器中的文件
  • 选择“Git历史”

注意:升级到Windows 10后,我失去了Git上下文菜单选项。但是,您可以在命令窗口中使用“gitk”或“gitk文件名”实现同样的事情。

调用“Git History”后,Git GUI工具将启动,并在左上角窗格中显示文件的历史记录。选择您要比较的版本之一。然后右键单击第二个版本并选择

区分此->选中

选择的差异->此

颜色编码的差异将出现在左下角窗格中。

所有其他的回答都更完整,所以投赞成票。这个只是为了记住你可以避免知道最近提交的id。通常,我将自己设置在我想要比较并运行diff工具的分支中,知道旧的提交uid(你可以使用其他符号):

git checkout mastergit difftool 6f8bba my/file/relative/path.py

此外,在此处检查其他响应以设置您希望git打开的工具来比较文件:使用. gitconfig配置diff工具去找扩散工具医生

如果你想了解更多关于DiveTool的信息,去找扩散工具医生