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

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

我正在寻找一种比较功能,例如Visual SourceSafe (VSS)或Team Foundation Server (TFS)中的功能。 Git 中可能吗?

答案

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

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

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

如果已配置 “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\"

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

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

如果要逐个提交查看两次提交之间文件的所有更改,也可以执行

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

这是一个 perl 脚本,可以打印出给定文件的 git diff 命令,如 git log 命令中所示。

例如

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

然后可以将其剪切 N 粘贴在 shell 窗口会话中,或通过管道传递到 / bin / sh。

笔记:

  1. 数字(在这种情况下为 3)指定要打印的行数
  2. 文件(在这种情况下为 pom.xml)必须在两个地方都同意(您可以将其包装在 shell 函数中以在两个地方提供相同的文件)或将其作为 shell 脚本放入 bin 目录中

码:

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

如果您有多个文件或目录,并且想要比较非连续提交,则可以执行以下操作:

建立临时分支

git checkout -b revision

倒退到第一个提交目标

git reset --hard <commit_target>

樱桃采摘那些有兴趣的人

git cherry-pick <commit_interested> ...

应用差异

git diff <commit-target>^

当你完成

git branch -D revision

如果要使用多个文件进行比较,请使用 @mipadi 指定的方法:

例如HEAD和您的master之间的差异,以查找所有.coffee文件:

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

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

这是使用 git 令人敬畏的另一种方式...

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

如果要在 Windows 上进行简单的视觉比较,例如可以使用 VSS 或 TFS,请尝试以下操作:

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

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

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

区别 -> 选择

要么

选择差异 -> 此

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