您从一个不正确的前提开始,因为git fetch 故意不更新任何文件。这是故意的:它允许您随时git fetch,因为它永远不会触及您可能正在处理的任何文件。 git fetch 所做的是向您的存储库添加更多提交,而不会影响工作区中实际签出的任何内容。 (如果你熟悉星际迷航下一代系列中的这些恶棍,Git 更像 Borg:你将新提交的技术独特性添加到你的 git-borg 集体。你用 git 做的大多数事情最终都会添加新的提交,旧的提交将永远存在。)
问题是 在您 git fetch 之后,您通常会运行 git merge,或者通常更合适的是 git rebase。这些命令将影响您的工作区文件,现在是时候询问会发生什么变化了。 (Git 鼓励与 svn 不同的工作流程,git rebase 与 svn up 不完全相同,但可能是您想要的。如果您从未进行任何更改,git merge --ff-only 可能就是您想要的想要在这里,但git rebase 会达到相同的结果。)
因为 git 允许甚至鼓励复杂的分布式工作流程(您和许多其他人都或多或少地同时进行许多更改),查看谁的更改会影响可能变得复杂的内容。但是,如果您自己从未进行任何更改,我们会得到一个更简单的情况,通过一种易于使用的方式来查看您刚刚从其他地方获得的内容,以及 git rebase 或 git merge --ff-only 会做什么。
很可能,您想要的是git diff --stat,如Mort answered。如果你使用git merge(有或没有--ff-only),git 会在完成后为你运行一个git diff --stat。此差异需要两个修订 ID,并将与第一个修订关联的树与与第二个修订关联的树进行比较。棘手的部分是选择修订 ID。从git fetch 的输出中复制它们是可行的,但很烦人。
以下是一种无需这种复制即可获得相同结果的不同方法:
git diff --stat origin/master@{1} origin/master
(取决于您的外壳,您可能需要引用花括号)。
名称 origin/master@{1} 告诉 git 获取在最近更新之前存储在 origin/master 中的值。这将是显示的第一个哈希 git fetch,在本例中为 ee28fb0...。
名称 origin/master 告诉 git 获取当前值,这就是 git fetch 刚刚设置的值:在本例中为 fdca511...。
这样做的好处是,您可以通过比较 origin/master@{2} 与 origin/master@{1} 或 origin/master 来回到更远的时间。
您还可以将master(您自己的分支)与以下任何一个进行比较:
git diff origin/master@{1} master
这将显示您在 您的 master 中所做的更改,与您在运行 git fetch 之前您的 origin/master 中的任何内容相比。 (添加--stat 以获得汇总版本而不是完整差异。)或者:git diff master origin/master 将向您展示您所拥有的与您刚刚获得的不同的东西。如果您从不进行自己的更改,那就是“他们从那时起所做的事情”。如果您确实进行了自己的更改,您将需要查看您和他们的 merge base,这是 rebase 和/或 merge 真正发挥作用的地方,但这是完全是另一个话题。