将当前工作副本与另一个分支的已提交副本进行比较。

224

我有一个存储库,主分支里有一个名为 foo 的文件。我切换到了 bar 分支并对 foo 进行了一些更改。现在我该如何运行 git diff 命令来比较这个未提交的副本和主分支上的副本呢?

8个回答

214
以下内容适用于我: < p >< code > git diff master:foo foo 以前可能是这样的: < p >< code > git diff foo master:foo

11
每次我看到你回答有关 git diff 的问题时,我总会想起 https://dev59.com/3m435IYBdhLWcg3wuicn#5257065 - VonC
2
您尝试使用“--”来区分参数和路径参数吗?git diff -- master:foo foo - VonC
我刚遇到了同样的问题,但在我的情况下,git diff foo master:foo 给出了致命错误,而 git diff master:foo foo 是可工作的版本!键入 -- 使它们都能正常工作。有任何解释吗? - Łukasz Kożuchowski
1
在1.8版本中,git diff -- master:foo foo无法正常工作 - 它似乎将参数master:foo视为不存在的文件名(并忽略它),而不是分支中的文件。尝试交换最后两个参数 - 如果成功了,差异比较应该被反转,但输出不会改变。 - Kelvin
9
对我来说正好相反 —— 我可以执行 git diff master:foo foo,但不能反过来。我也不理解为什么。在 git 1.7.9.5 / Ubuntu 12.04 中,至少我可以执行 git diff -R master:foo foo 来获得我实际想要的差异。当我尝试在 msysgit 1.9.4 / Windows 7 x64 中执行时,会出现 fatal: unable to read 0000000000000000000000000000000000000000 的错误。如果不加 -R,则会像你使用 git 1.7.9.5 时一样收到相同的错误消息,但是在 1.9.4 中我会收到 fatal: master:foo: no such path in the working tree 的错误消息。 - JMM
显示剩余8条评论

133

您正在尝试将工作树与特定的分支名称进行比较,因此您需要执行以下操作:

git diff master -- foo

这是来自 git-diff 的这种形式(请参见 git-diff 手册)

   git diff [--options] <commit> [--] [<path>...]
       This form is to view the changes you have in your working tree
       relative to the named <commit>. You can use HEAD to compare it with
       the latest commit, or a branch name to compare with the tip of a
       different branch.

顺便提一下,还有一个--cached(也称为--staged)选项,用于查看您已暂存的差异而不是工作树中的所有内容:

   git diff [--options] --cached [<commit>] [--] [<path>...]
       This form is to view the changes you staged for the next commit
       relative to the named <commit>.
       ...
       --staged is a synonym of --cached.

2
谢谢。不知道为什么,但这个答案是我在Linux上使用git 1.8.1时唯一有效的。 - srking
非常好,谢谢。我一直想在diff命令中包含当前分支的名称,但我发现这并不需要。 - yoyo
这在几个月前对我起作用,但现在似乎不行了。目前我使用的是git版本2.7.4(Apple Git-66);我不知道之前用的是什么版本。 - hBrent
@hBrent,这在我的OSX 10.11上仍然适用于git 2.7.3。如果有帮助的话,这是一个快速示例repo和说明:https://github.com/jordan-brough/git-diff-test/ - Jordan Brough
感谢@JordanBrough。 - hBrent
适用于项目子目录中的文件。其他建议的方法除非您写出整个路径,否则无法找到文件。 - pauljohn32

18
git difftool tag/branch filename

这是对我而言唯一有效的答案,用于比较本地工作副本与远程存储库(非“origin”)中该文件版本之间的区别。谢谢Adir和Baz。 - Mouse
根据文档 https://git-scm.com/docs/git-difftool,`git difftool没有-v选项。你是不是想用-y`? - ks1322

15

另外:git diff master..feature foo

因为对于我来说,git diff foo master:foo 在目录上不起作用。


我也不知道。这是Windows的问题吗? - Scott Stafford
@ScottStafford 我使用的是Ubuntu,所以看起来这不仅仅是Windows的问题。 - ArtBIT
只要我明确给出两个分支名称(windows),这对我来说是有效的:git diff branch1:foo master:foo - Meep

10
git diff mybranch master -- file

应该也可以工作


6
这仅适用于提交到“mybranch”分支的文件,而不是当前工作副本中的文件。 - yoyo
"--" 上面的意思是什么? - Pushparaj
这允许在两个方向上进行比较:git diff deployment master -- filegit diff master deployment -- file 可以与任意两个分支正常工作。 - viktorkho
@Pushparaj "--"是在命令的其余部分和文件路径之间的可选分隔符。这对于避免歧义非常有用,例如如果您有一个同名的文件和分支。 - Tim Goodman

10

还有其他可行的方法:

git diff master ./relative-path-to-foo

6

查看与当前分支的本地变更

git diff .

查看本地更改与任何其他现有分支的比较

git diff <branch-name> .

查看特定文件的更改

git diff <branch-name> -- <file-path>

确保在开始时运行git fetch


0
假设您有一个名为master的分支和一个名为feature的分支,并且您想要检查一个名为my_file的特定文件,那么:
  1. git diff master..feature /Path/to/my_file 显示分支masterfeature上提交版本的my_file之间的差异。
  2. git diff master -- /Path/to/my_file 显示工作目录(未暂存的文件)和分支mastermy_file之间的差异。

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