1322

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

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

4

11 回答 11

1673

git-diff手册页:

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
于 2010-07-26T19:13:13.993 回答
338

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

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

于 2010-07-27T12:18:06.937 回答
99

如果您配置了“difftool”,您可以使用

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 文件中应该有以下条目。安装 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 Enterprise 或 Community Edition - 它是 3 路合并的最佳工具之一。

于 2012-01-03T11:45:07.500 回答
67

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

$ git diff (sha-id-one) (sha-id-two)
于 2012-04-19T00:14:48.537 回答
42

如果您想逐个提交查看两次提交之间文件的所有更改,您也可以这样做

git log -u $start_commit..$end_commit -- path/to/file

于 2010-07-26T20:50:54.087 回答
22

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

例如

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.

笔记:

  1. 数字(在本例中为 3)指定要打印的行数
  2. 文件(在这种情况下为 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;
}
于 2013-07-11T22:24:10.800 回答
16

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

创建一个临时分支(本例中为“修订”

git checkout -b revision

回退到第一个提交目标

git reset --hard <commit_target>

对那些有兴趣的承诺采摘樱桃

git cherry-pick <commit_interested> ...

应用差异

git diff <commit-target>^

当你完成

git branch -D revision
于 2012-08-25T14:08:51.653 回答
15

如果你想用@mipadi 指定的方法创建多个文件的差异:

例如 diffHEAD和 your master, 查找所有.coffee文件:

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

这将递归地搜索您your_search_folder/的所有.coffee文件,并在它们及其master版本之间进行区分。

于 2012-11-30T15:04:43.167 回答
12

只是使用 Git 的另一种方式......

git difftool HEAD HEAD@{N} /PATH/FILE.ext
于 2012-08-02T20:13:45.813 回答
5

所有其他回复都更完整,因此请点赞。这只是要记住,您可以避免知道最近提交的 id。通常,我将自己设置在要比较的分支中,并在知道旧的提交 uid 的情况下运行差异工具(您可以使用其他符号):

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

另外,请在此处检查此其他响应以设置您希望 git 打开的工具以比较文件: 使用 .gitconfig 配置差异工具 要了解有关 difftool 的更多信息,请转到 difftool 文档

于 2020-08-11T17:00:56.083 回答
4

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

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

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

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

区分这个 -> 选择

或者

选择差异 -> 这个

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

于 2015-01-08T14:35:45.920 回答