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

sys*_*out 1077 git git-diff

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

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

mip*_*adi 1405

git-diff联机帮助页:

git diff [--options] <commit> <commit> [--] [<path>...]
Run Code Online (Sandbox Code Playgroud)

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

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
Run Code Online (Sandbox Code Playgroud)

  • `..`并不是必需的,虽然它可以使用它(除了相当旧的版本,也许).您还可以使用`git log`或`gitk`来查找要使用的SHA1,如果这两个提交相距很远的话.`gitk`在其上下文菜单中也有一个"diff selected - > this"和"diff this - > selected". (41认同)
  • @ user64141` - `非常有用,例如当你有一个名为`-p`的文件时.仅在极少数情况下需要在脚本中使用. (27认同)
  • 那么" - "的目的是什么? (23认同)
  • 即使在2次提交之间修改了文件名,这是否也能正常工作? (14认同)
  • 注意:您需要使用相对于repo根目录的路径.相对于当前工作目录的路径将不起作用. (10认同)
  • `git diff master..HEAD - $(找到your_search_folder/-name'*.c')`用于区分目录中的所有`.c`文件. (3认同)
  • HEAD ^^^`语法的意思是“比较3个仓库提交”,而不是3个“文件提交”。一种解决方法是指定日期,例如`git diff -w @ {2016-01-01} filename``-w'表示忽略空白更改。 (2认同)
  • 对我不起作用.始终显示零更改,但文件已更改. (2认同)
  • 如果提交之间存在文件夹结构更改,则需要使用 git diff commit_hash_1:folder/file.ext commit_hash_2:new_folder/file.ext (2认同)
  • 链接的手册页没有提到“HEAD~2”,甚至没有提到“~”。另外,为什么 `diff HEAD~2 HEAD~1` 或 `diff HEAD~3 HEAD~2` 等不返回任何内容? (2认同)

Jak*_*ski 262

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

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

  • 请注意,如果`<file_1>`和`<file_2>`在当前目录中,而不是在顶级git托管目录中,则必须在Unix上添加`./`:`<revision_1>:./ filename_1` (23认同)
  • <revision>:可以省略,因此您可以使用尚未提交的文件进行区分. (7认同)
  • 请注意,在Windows上,必须使用“ /”作为文件路径,而不是“ \”。 (2认同)

Anv*_*hat 82

如果您已配置"difftool",则可以使用

git difftool revision_1:file_1 revision_2:file_2
Run Code Online (Sandbox Code Playgroud)

示例:将文件从其上次提交与先前在同一分支上的提交进行比较:假设您处于项目根文件夹中

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java
Run Code Online (Sandbox Code Playgroud)

您应该在〜/ .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\"
Run Code Online (Sandbox Code Playgroud)


Vib*_*uti 46

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

$ git diff (sha-id-one) (sha-id-two)
Run Code Online (Sandbox Code Playgroud)

  • 如果需要特定文件的diff,请在命令末尾添加路径. (17认同)
  • `git diff(sha-id-one)(sha-id-two)-filename.ext`没有文件名,它将列出这两次提交中* all *文件的差异。 (2认同)

cxr*_*reg 39

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

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


小智 21

这是一个perl脚本,它打印出git log命令中找到的给定文件的git diff命令.

例如

git log pom.xml | perl gldiff.pl 3 pom.xml
Run Code Online (Sandbox Code Playgroud)

产量:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml
Run Code Online (Sandbox Code Playgroud)

然后可以将其粘贴在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;
}
Run Code Online (Sandbox Code Playgroud)


dvd*_*vck 13

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

做一个时间分支

git checkout -b revision
Run Code Online (Sandbox Code Playgroud)

回退到第一个提交目标

git reset --hard <commit_target>
Run Code Online (Sandbox Code Playgroud)

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

git cherry-pick <commit_interested> ...
Run Code Online (Sandbox Code Playgroud)

应用差异

git diff <commit-target>^
Run Code Online (Sandbox Code Playgroud)

当你完成

git branch -D revision
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解决方案.它适用于我的用例.我唯一要更新的是,当你完成后,你不能删除分支,直到你关闭它. (2认同)

And*_*tre 11

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

例如,HEAD和你之间的差异master,找到所有.coffee文件:

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
Run Code Online (Sandbox Code Playgroud)

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


Raú*_*tín 11

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

git checkout master
git difftool 6f8bba my/file/relative/path.py
Run Code Online (Sandbox Code Playgroud)

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


Edd*_*e B 9

另一种使用git真棒的方法......

git difftool HEAD HEAD@{N} /PATH/FILE.ext
Run Code Online (Sandbox Code Playgroud)


Res*_*rce 5

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

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

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

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

区分此 -> 选择

或者

差异选择->这个

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