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

时间:2010-07-26 19:10:25

标签: git git-diff

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

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

11 个答案:

答案 0 :(得分:1321)

来自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

答案 1 :(得分:244)

您还可以在两个不同的版本中比较两个不同的文件,例如:

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

答案 2 :(得分:78)

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

答案 3 :(得分:40)

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

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

答案 4 :(得分:38)

如果您希望在逐个提交的基础上查看两个提交之间的文件的所有更改,您也可以

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

答案 5 :(得分:21)

这是一个perl脚本,它打印出git log命令中找到的给定文件的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窗口会话中粘贴N或者通过管道传送到/ bin / sh。

注意:

  1. 数字(本例中为3)指定要打印的行数
  2. 文件(本例中为pom.xml)必须在两个地方都一致(你可以将它包装在shell函数中以在两个地方提供相同的文件)或者将它作为shell脚本放在bin目录中
  3. 代码:

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

答案 6 :(得分:13)

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

制作时间分支

git checkout -b revision

快退到第一个提交目标

git reset --hard <commit_target>

对那些提交感兴趣的人采摘樱桃

git cherry-pick <commit_interested> ...

应用差异

git diff <commit-target>^

完成后

git branch -D revision

答案 7 :(得分:11)

如果你想用多个文件做一个diff,用@mipadi指定的方法:

E.g。 HEADmaster之间的差异,以查找所有.coffee个文件:

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

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

答案 8 :(得分:8)

使用git非常棒的另一种方式...

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

答案 9 :(得分:1)

如果你想在Windows上进行简单的视觉比较,比如你可以进入VSS或TFS,试试这个:

  • 右键单击文件资源管理器中的文件
  • 选择'Git History'

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

一旦你调用'Git History',Git GUI工具就会启动,左上方窗格中会显示该文件的历史记录。选择您要比较的其中一个版本。然后右键单击第二个版本并选择

差异 - &gt;选中

选择差异 - &gt;此

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

答案 10 :(得分:1)

所有其他响应都比较完整,因此请投票。 这只是要记住,您可以避免知道最近提交的ID。通常,我将自己设置在要比较的分支中,并在知道旧提交uid的情况下运行diff工具(可以使用其他表示法):

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

此外,在此处检查此其他响应,以设​​置要git打开以比较文件的工具: Configuring diff tool with .gitconfig 要了解有关difftool的更多信息,请go to the difftool doc