无法使用 git diff 对远程提交的更改进行 diff

Cannot diff committed changes against remote using git diff

我想做的是查看提交给本地仓库的更改与远程仓库的对比。

当我执行 git status 时,我得到:

On branch develop  
Your branch is ahead of 'origin/develop' by 6 commits.  
  (use "git push" to publish your local commits)  
  nothing to commit, working directory clean  

How do I show the changes which have been staged?

中所讨论

git 差异中的一个(两个)应该可以工作。不幸的是,在我的情况下,所有这些 return 什么都没有。

git diff //empty - which seems to be fine 
git diff --cached //empty 
git diff HEAD //empty

我是不是漏掉了什么?

您有远程存储库中不存在的提交。 git diff 不是为您提供任何相关信息的命令。

Git diff 显示您尚未提交对本地存储库的更改。由于这个原因,您不会在差异中得到任何东西。您没有对本地存储库进行任何更改。

Git 认识几个 "stages"

  1. 对本地存储库的更改。与提交的版本相比,您有一个文件进行了一些更改。您会看到这些更改 git diff
  2. 分阶段更改,准备提交到本地存储库。这是一组准备提交的更改。如果您 git commit 并由 git add 带入此阶段,这就是将要提交的内容。您会看到这些变化 git diff --cached
  3. 已提交更改。现在(至少在本地)这是本地存储库中文件的新现状。如果需要,您可以将其推送到远程存储库。

您已经提交了更改。

Diff 将显示索引和存储库之间的差异。

如果要查看本地存储库与远程存储库之间的更改,请执行以下操作:

git fetch --all --prune
git log ^master origin/master

// or:
git log master ^origin/master

这两行之间的区别在于,第一行将显示 pull diff,而第二行将显示 push diff

您已经尝试了三种形式的 git diff:无选项、--cached 和指定单个修订版(在本例中为 HEAD)。您链接到的问题中的第二个答案显示了 git diff 这三种形式的作用的一个很好的图形摘要。 None 这些都是你想要的。

但是,还有更多形式!

您可以要求 git diff 比较两个特定的提交(修订),例如:

git diff HEAD@{upstream} HEAD

或:

git diff origin/develop develop

根据您引用的 git status 输出,这些将做同样的事情,因为 HEAD 目前与 develop 相同(您在 "on branch develop" git status 输出),HEAD@{upstream} 将解析为 origin/develop ("ahead of 'origin/develop' by 6 commits")。 (请注意,在某些 shells/command-line-interpreters 中,您可能需要引用一个或两个花括号。)

您还可以使用:

git diff HEAD@{upstream}..HEAD

这种带有两个点 .. 的符号通常表示其他含义:有关详细信息,请参阅 the gitrevisions documentation。但是,当使用 git diff 时,前端命令只是将此解析为两个指定的提交,然后使用这两个。


你会得到更多——我认为更典型的是你可能想要的——通过:

git log -p HEAD@{upstream}..HEAD

因为这将单独显示每个提交,以及这些提交所做的更改。 Git 通过将每个提交与其父提交进行比较来找到这些更改。 (这也是 git 如何确定哪些提交 这六个。这在 "SPECIFYING RANGES" 部分中以相当图论的形式进行了描述。)本质上,git log -p 查看要显示的每个提交,然后在该提交的父级和该提交之间执行 git diff

对于合并提交,git log -p 的输出(以及 git show 的输出,类似于 git log -p 但只显示特定的提交或其他对象,你问它显示,而不是像 git log) 那样遍历提交历史被修改:git 默认显示 "combined diff",它试图突出显示合并过程中发生的事情,而不是在合并过程中发生的事情两个分支。您现在不需要对此了解太多,只需记住,在记录或显示合并时,git 隐藏了不需要的复杂性(这在您需要之前很好;然后搜索 Whosebug :-))。

如果您省略 -pgit log 将只显示提交消息。有关(许多)更多选项,请参阅 the git log documentation


一样,所有这些命令都使用git基于上次git调用遥控器的想法"where the remote is"并获取最新信息。此信息可能已过时,甚至可能过时几秒,甚至几分钟或(喘气)小时。 :-) 要使本地 git 与遥控器同步,您必须 运行 git fetch(额外的标志,--all--prune,并不总是需要,尽管它们可能是一个好主意,具体取决于您与谁共享以及如何共享)。 运行 git fetch 随心所欲;请记住,您可能会过时几秒钟或几个月,并且 git 不会关心任何一种方式:您想要更新的频率由您决定。

这可能来得太晚了。但是,如果您使用 OS X,并且您的 git core.pager 或 LESS 环境变量具有 -F 选项。有时 git diff 什么都不显示。

(git程序很扎实,你遇到[=19=的错误的可能性不大。这似乎是OS上的/usr/bin/less的错误 X .)