【问题标题】:Cannot diff committed changes against remote using git diff无法使用 git diff 对远程提交的更改进行比较
【发布时间】:2015-12-27 23:09:02
【问题描述】:

我想要查看提交到本地存储库与远程存储库的更改。

当我执行 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 diff 应该可以工作。不幸的是,就我而言,它们都没有返回任何东西。

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

我错过了什么吗?

【问题讨论】:

  • 既然您已经提交了所有之前阶段性的更改,您希望看到什么? git diff 应该与什么比较?

标签: git git-commit git-diff


【解决方案1】:

您已经提交了更改。

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

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

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

// or:
git log master ^origin/master

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

【讨论】:

    【解决方案2】:

    您尝试了三种形式的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 :-))。

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


    作为codeWizard noted above,所有这些命令都使用了git 的“远程在哪里”的想法,基于最后一次git 调用远程并获取最新信息。此信息可能已过时,甚至可能过时几秒钟,甚至几分钟或(喘气)小时。 :-) 要让本地 git 与远程同步,您必须运行 git fetch(额外的标志 --all--prune 并不总是需要,尽管它们可能是一个好主意,具体取决于谁您正在分享以及如何分享)。随心所欲地运行git fetch;请记住,您可能会过时数秒或数月,而 git 不会在意这两种情况:您想要更新的频率由您决定。

    【讨论】:

      【解决方案3】:

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

      git 程序非常可靠,你不太可能遇到 git 的错误。这似乎是 OS X 上的/usr/bin/less 的错误。)

      【讨论】:

        【解决方案4】:

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

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

        Git 知道几个“阶段”

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

        【讨论】:

        • “上游”? git 没有 upstream 的概念
        • 很公平,尽管您和我都知道,在许多流程中,将特定的远程存储库称为上游(尤其是在开源软件开发中)。你还是对的,我更正了这个错误术语的用法。
        • git diff 不适用于遥控器。曾经。 (如果您明确告诉它这样做,它可以在您的远程本地结帐上工作,例如git diff origin/master)。所以你可能想删除你的第一行,因为它充其量是误导。
        • 确实如此,我并没有相反的说法。我声明 OP 具​​有远程存储库中不存在的提交,因为这是触发混乱的通知通知我们的内容。然后我继续解释 git diff 的实际用途。就这些。非常欢迎你帮助我给出更好的答案,你真的是。但我可以减少被动攻击性:) 我会再次编辑帖子以更清楚地说明这一点。
        猜你喜欢
        • 2016-07-02
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 2017-11-19
        • 1970-01-01
        • 2016-01-14
        • 1970-01-01
        • 2014-02-07
        相关资源
        最近更新 更多