代码之家  ›  专栏  ›  技术社区  ›  systempuntoout

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

  •  977
  • systempuntoout  · 技术社区  · 14 年前

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

    我在找一个 比较 像里面的那个 Visual SourceSafe (VSS)或 Team Foundation Server (TFS)。在Git中有可能吗?

    10 回复  |  直到 6 年前
        1
  •  1298
  •   mikek3332002    9 年前

    git-diff MangPix:

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

    例如,要查看“now”和“two commitback”之间文件“main.c”的区别,以下是三个等效命令:

    $ git diff HEAD^^ HEAD main.c
    $ git diff HEAD^^..HEAD -- main.c
    $ git diff HEAD~2 HEAD -- main.c
    
        2
  •  238
  •   Jakub Narębski adamtaub    14 年前

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

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

        3
  •  76
  •   Anver Sadhat    9 年前

    如果配置了“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
    

    您应该在~/.git config或project/.git/config文件中包含以下条目。安装p4merge[这是我首选的diff和merge工具]

    [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\"
    
        4
  •  39
  •   kenorb    9 年前

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

    $ git diff (sha-id-one) (sha-id-two)
    
        5
  •  38
  •   cxreg    14 年前

    如果您希望在一次提交一次提交的基础上查看两次提交之间对文件的所有更改,也可以这样做

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

        6
  •  21
  •   user2520657    11 年前

    下面是一个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
    

    然后可以在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;
    }
    
        7
  •  13
  •   dvdvck    12 年前

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

    做一个暂时的分支

    git checkout -b revision
    

    返回到第一个提交目标

    git reset --hard <commit_target>
    

    对那些有兴趣的人进行挑选

    git cherry-pick <commit_interested> ...
    

    应用差异

    git diff <commit-target>^
    

    当你完成

    git branch -D revision
    
        8
  •  11
  •   Andrei-Niculae Petre    12 年前

    如果要使用@mipadi指定的方法对多个文件进行diff:

    例如,两者之间的差异 HEAD 你的 master 寻找所有 .coffee 文件夹:

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

    这将递归搜索 your_search_folder/ 为了所有 咖啡 文件并在它们和它们之间进行比较 主人 版本。

        9
  •  8
  •   Edward J Beckett    12 年前

    只是使用Git的另一种方法…

    git difftool HEAD HEAD@{N} /PATH/FILE.ext
    
        10
  •  1
  •   Resource    6 年前

    如果您希望在Windows上进行简单的可视比较,例如可以在VSS或TFS中进行比较,请尝试以下操作:

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

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

    一旦调用“git history”,git gui工具将启动,文件的历史记录位于左上方窗格中。选择要比较的版本之一。然后右键单击第二个版本并选择

    与此不同--选定

    所选差异-此

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