两个不同文件之间的Git差异

248
在最新提交的HEAD中,我有一个名为foo的文件。在我的当前工作树中,我将其重命名为bar,并进行了编辑。
我想在HEAD中的foo和当前工作树中的bar之间执行git diff

122
我认为这个问题(从标题中看)可能是关于在两个文件上使用Git diff,而这两个文件不一定在仓库中。我发现--no-index标志就是为此而设的,例如,git diff --no-index --word-diff old_file.txt new_file.txt(--word-diff按单词而不仅是行高亮显示更改,在处理长文本时非常有用)。 - Pat
非常相似的问题。这个问题关注的是当一个文件(至少)在工作树中时,另一个问题关注的是当两个文件都已提交时。 - Josiah Yoder
3个回答

274

我相信使用--no-index是你想要的:

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

如 Git 手册所述:

这种形式是用来比较文件系统中给定的两个路径。当在被 Git 控制的工作树中运行该命令并且至少有一条路径指向工作树之外,或者当在被 Git 控制之外的工作树中运行该命令时,您可以省略 --no-index 选项。


7
非常有用的是,可以利用git强大的空格不敏感的“单词差异”(例如:git diff --no-index --word-diff file1 file2),即使对于那些没有受到git控制的文件也是如此。(至少对我来说,在git v2.25.1,Ubuntu v20.04上是这样的。) - Johnny Utahh

257

明确指定路径:

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

请查看 git-diff文档中的 --find-renames 选项。

来源: twaggs

git diff <path> <path> 可以比较两个工作树文件,只要它们中至少有一个不在 Git 仓库中或从 Git 仓库外运行该命令。如果您想确保 Git 知道您只比较工作树中的文件(也就是目录中的文件而不是已添加或提交到 Git 的文件),请使用 git --no-index <path> <path>


64
我想提一下,即使它们不在 git 存储库中,您也可以使用 git diff <path> <path> 比较任意两个文件。 - mitenka
10
我认为这不正确。如果你查看 git diff --help,你会发现仅支持两个文件的模式是 git diff [<options>] --no-index [--] <path> <path>git diff a b 只匹配提交模式,而不是文件。 - Doug
3
@Doug 这是你提到的 help 命令中的引用,https://git-scm.com/docs/git-diff: 展示两个磁盘上文件之间的差异。 - mitenka
10
谢谢你的意见,以下是你所提到的帮助文档中的引用:当在由Git控制的工作树中运行命令并且至少有一个路径指向工作树之外时,或者当在由Git控制的工作树之外运行命令时,可以省略--no-index选项。请注意,这里不包括解释。 - mitenka
3
使用上述代码而不包含 HEAD: 对我有效。 - Anupam
显示剩余6条评论

4
如果你正在使用tortoise git, 你可以通过以下方式得到一个文件的差异比较结果: 1.右键点击第一个文件,在tortoisegit子菜单中选择“晚些时候再比较差异”; 2.然后右键点击第二个文件,在tortoisegit子菜单中选择“与yourfilenamehere.txt进行比较差异”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接