在我完全回答之前,请注意:
git merge master origin/master
请不要这样做:你只想要git merge origin/master,而不是git merge master origin/master。 (幸运的是,当您运行此程序时,您 on master,因此 Git 最终忽略了 master 部分。如果没有,您会看到 Merge made by the octopus strategy。)
让我们先回答这部分:
我喜欢src/main.js 中的差异以这种方式描述,但该信息仅在我合并时出现,所以我的问题是,我应该使用什么命令来查看关于差异的相同信息但在合并之前?
要查看 git merge 会说什么(假设您的工作树是“干净的”,git status 会说“没有提交”),运行:
git diff --stat HEAD...HEAD@{upstream}
生成摘要的是--stat。让我们在这里暂缓一下git diff 的论点;但让我们注意(因为它很重要)这是假设一个简单的、普通的单合并基提交合并或快进操作(这些很可能)。
调用git fetch后如何检查文件更改?
这个问题本身揭示了一些混乱(自然混乱,因为 Git 非常混乱 :-))。具体来说,git fetch 没有更改任何文件。git fetch 所做的是获取新的提交。每个提交都是一个快照——所有文件在你创建快照时的副本——而快照本身并不是一个更改。
不过,与此同时,如果您查看带有 git show 或 git log -p 的快照,Git 将显示更改。如果一个快照是一个快照,而不是一个变更集,Git 怎么能显示一个变更呢?好吧,经过一番思考,答案是显而易见的。就像"spot the difference" pictures / quizzes 中的一个:
- 查看上一个快照。
- 然后看看这个快照。
- 发生了什么变化?
这就是git show 向您显示变更集的方式,即使提交是快照。该提交有一个父提交,Git 只是比较git diff、父<em>hash</em>~1 或<em>hash</em>^1,以及哈希为hash 的提交。 (~1 和 ^1 后缀都在 Git 图中退一步。)
关于git diff 及其论点
git diff 命令非常复杂,因此它可以做的不仅仅是这些,但首先,它只是比较两个完整的快照。你如何命名它们并不重要:
git diff origin/master master
例如,将找到 origin/master 命名的提交(哈希 ID)和 master 命名的提交,然后将两者进行比较。输出是一组指令:这是如何更改第一次提交以使其看起来像第二次提交。
你可以写:
git diff origin/master..master
如果您愿意。当你用git log 做这种事情时,你会经常看到很多提交,而不仅仅是两个。 git diff 命令不同:它只查看 这两个 提交。实际上,它丢弃了 .. 部分(当然,它们用于分隔两个名称)。
说到合并,还有一个特殊的git diff 语法:git diff A...B 表示git diff $(git merge-base A B) B。这就是我们上面使用的。通常,三点语法具有不同的含义; git diff 将其改为“告诉我合并会做什么”的意思。
(这与 git merge 在完成合并后 最后运行的内容不太一样,因为在合并完成后,合并基础发生了变化。而且,如果合并基础不只是单个提交,git diff A...B 语法无论如何都会选择一个单个提交,并比较这两个提交,而git merge 将默认采用更复杂的策略。因此,在真正合并完成后, Git 可以只运行git diff --stat HEAD^ HEAD,它本质上就是这样做的。对于快进的非真正合并“合并”,Git 可以运行git diff --stat HEAD@{1} HEAD。)
有关三点符号的普通和特殊 Git-diff-only 含义的更多信息,请参阅 the gitrevisions documentation 和 the git diff documentation。