两个不同文件之间的git diff


108

HEAD(最新提交)中,我有一个名为的文件foo。在当前的工作树中,我将其重命名为bar,并对其进行了编辑。

我想进入git diff fooHEAD,并bar进入当前的工作树中。


64
我以为这个问题(从标题开始)可能是关于在不一定要回购的两个文件上使用git diff。我发现--no-index标志是为此目的而设计的,例如git diff --no-index --word-diff old_file.txt new_file.txt(--word-diff突出显示了按单词而不是仅按行显示的更改,这对于长文本非常有用)。
专利

Answers:


134

明确指定路径:

git diff HEAD:full/path/to/foo full/path/to/bar

签出docs中--find-renames选项。git-diff

信用:twaggs


8
我想提一提,git diff <path> <path>即使两个文件不在git存储库中,您也可以使用它们进行比较。
mitenka '17

1
@mitenka我认为这是不正确的。如果您看一下,git diff --help将会看到两个文件唯一支持的模式是git diff [<options>] --no-index [--] <path> <path>git diff a b仅匹配提交模式,不匹配文件。
道格

@Doug这是您提到的帮助命令的引号git-scm.com/docs/git-diff:显示磁盘上两个文件之间的更改。
mitenka

@mitenka帮助说,除非您使用“ --no-index”,否则它不会比较文件;您的评论应该是一个单独的答案;这是不正确的,并且与该答案无关。
道格

@道格谢谢您的意见。这是您所引用的帮助的引文:--no-index当在由Git控制的工作树中运行命令并且该工作树之外的至少一条路径指向运行时,或者在由Git控制的工作树外部运行命令时,可以忽略此选项。 。
mitenka

77

我相信--no-index您正在寻找的是使用:

git diff [<options>] --no-index [--] <path> <path>

如git手册中所述:

这种形式是比较文件系统上给定的两个路径。在由Git控制的工作树中运行命令并且工作树之外至少有一个路径点时,或者在由Git控制的工作树外部运行命令时,可以 忽略--no-index选项。


1
@swe绝对是一个有用的答案,但是OP特别声明该文件在HEAD中,这意味着它在git索引中。接受的答案直接解决了问题。同样被接受的答案有6年的领先优势;)
Michael Delgado

3
这可能对OP没有帮助,但这正是我想要的。
thislooksfun

如果您不愿意在网络上这样做,这将回答标题所发布的问题。
Merlin

3

如果您使用的是tortoise git,则可以右键单击一个文件,然后通过以下方式git diff:在第一个文件上单击鼠标右键,然后通过tortoisegit子菜单选择“稍后比较”,然后在第二个文件上也可以右键单击,请进入tortoisegit子菜单,然后选择“与您的文件名在此处为.diff”。


-12

使用PhpStorm,我只复制了先前的提交代码,并使用内置的“与剪贴板比较”工具将其与当前版本进行比较。


5
PhpStorm是一种商业IDE。这个问题是关于如何在git cli本身中执行此操作的,没有任何其他软件的假定。
查尔斯·泰勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.