您尝试了三种形式的git diff:无选项、--cached,并指定了单个修订版(在本例中为HEAD)。您链接到的问题中的第二个答案显示了这三种形式的git diff 所做的很好的图形摘要。这些都不是你想要的。
不过,还有更多的形式!
您可以要求git diff 比较两个特定的提交(修订),例如:
git diff HEAD@{upstream} HEAD
或:
git diff origin/develop develop
根据您引用的git status 输出,这些将做同样的事情,因为HEAD 当前与develop 相同(您在git status 输出中“在分支开发”),并且@ 987654335@ 将解析为origin/develop(“在 'origin/develop' 之前 6 次提交”)。 (请注意,在某些 shell/命令行解释器中,您可能必须引用一个或两个大括号。)
你也可以使用:
git diff HEAD@{upstream}..HEAD
这个符号,带有两个点..,通常意味着别的东西:有关详细信息,请参阅the gitrevisions documentation。然而,当使用git diff 时,前端命令只是将此解析为两个指定的提交,然后使用这两个。
你会得到更多——我认为更典型的是你可能想要的——通过:
git log -p HEAD@{upstream}..HEAD
因为这将分别显示每个提交,以及这些提交所做的更改。 Git 通过将每个提交与其父提交进行比较来找到这些更改。 (这也是 git 如何确定这六个提交 的方式。这在“指定范围”部分中以图形理论的形式进行了描述。)本质上,git log -p 着眼于每个提交都会显示,然后在该提交的父级和该提交之间执行git diff。
对于合并提交,git log -p 的输出(和git show 的输出,类似于git log -p 但只显示特定提交或其他对象,您要求它显示,而不是遍历提交像git log) 这样的历史记录被修改:git 默认显示“组合差异”,它试图突出显示合并过程中发生的事情,而不是两个分支中发生的事情。您现在不需要对此了解太多,只需记住在记录或显示合并时,git 会隐藏不需要的复杂性(在您想要它之前这很好;然后搜索 StackOverflow :-))。
如果你省略了-p,git log 将只显示提交消息。请参阅the git log documentation 了解(许多)更多选项。
作为codeWizard noted above,所有这些命令都使用了git 的“远程在哪里”的想法,基于最后一次git 调用远程并获取最新信息。此信息可能已过时,甚至可能过时几秒钟,甚至几分钟或(喘气)小时。 :-) 要让本地 git 与远程同步,您必须运行 git fetch(额外的标志 --all 和 --prune 并不总是需要,尽管它们可能是一个好主意,具体取决于谁您正在分享以及如何分享)。随心所欲地运行git fetch;请记住,您可能会过时数秒或数月,而 git 不会在意这两种情况:您想要更新的频率由您决定。