无法使用 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"
- 对本地存储库的更改。与提交的版本相比,您有一个文件进行了一些更改。您会看到这些更改
git diff
- 分阶段更改,准备提交到本地存储库。这是一组准备提交的更改。如果您
git commit
并由 git add
带入此阶段,这就是将要提交的内容。您会看到这些变化 git diff --cached
- 已提交更改。现在(至少在本地)这是本地存储库中文件的新现状。如果需要,您可以将其推送到远程存储库。
您已经提交了更改。
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 :-))。
如果您省略 -p
,git 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 .)
我想做的是查看提交给本地仓库的更改与远程仓库的对比。
当我执行 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"
- 对本地存储库的更改。与提交的版本相比,您有一个文件进行了一些更改。您会看到这些更改
git diff
- 分阶段更改,准备提交到本地存储库。这是一组准备提交的更改。如果您
git commit
并由git add
带入此阶段,这就是将要提交的内容。您会看到这些变化git diff --cached
- 已提交更改。现在(至少在本地)这是本地存储库中文件的新现状。如果需要,您可以将其推送到远程存储库。
您已经提交了更改。
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 :-))。
如果您省略 -p
,git log
将只显示提交消息。有关(许多)更多选项,请参阅 the git log
documentation。
与git fetch
(额外的标志,--all
和 --prune
,并不总是需要,尽管它们可能是一个好主意,具体取决于您与谁共享以及如何共享)。 运行 git fetch
随心所欲;请记住,您可能会过时几秒钟或几个月,并且 git 不会关心任何一种方式:您想要更新的频率由您决定。
这可能来得太晚了。但是,如果您使用 OS X,并且您的 git core.pager
或 LESS 环境变量具有 -F
选项。有时 git diff
什么都不显示。
(git
程序很扎实,你遇到[=19=的错误的可能性不大。这似乎是OS上的/usr/bin/less
的错误 X .)