如何在调用 git fetch 后查看更改的文件

How to see changed files after calling git fetch

如果两个人在 github 上的同一个存储库和同一个分支主管上工作。然后说 A 将他们的更改推送给 master,而我作为 B,我如何检查调用 git fetch 后更改的文件?

如果我这样做:

git fetch
git merge master origin/master

我得到这一行:

aa@DESKTOP-KQQ0A3T MINGW64 ~/..
$ git merge master origin/master
Merge made by the 'recursive' strategy.
 src/main.js | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

我喜欢 src/main.js 中的差异是如何描述的,但该信息仅在我合并时出现,所以我的问题是,我应该使用什么命令来查看关于差异的相同信息但是在做合并之前?

此命令将帮助您:

git diff master:src/main.js

看起来这个问题与这个主题有部分重复:

git: diff between file in local repo and origin

获取后你想做的事:

git diff ..origin/master

这里 rholmes 的回答更加详细: How to check real git diff before merging from remote branch?

当您知道自己触摸了哪些文件时要快速查看,您还可以尝试:

git log —name-status HEAD..origin/master

这将使您快速了解 co-workers 提交以及在该提交中修改了哪些文件。如果您注意到修改的文件之一也是您正在处理的文件,那么您可以继续比较文件:

git diff master:src/main.js

在我回答之前,请注意:

git merge master origin/master

请不要这样做:您只需要 git merge origin/master,而不是 git merge master origin/master。 (幸运的是,当你 运行 这个时候你是 on master,所以 Git 最终忽略了 master 部分。如果它有不,你会看到 Merge made by the octopus strategy.)


先回答这部分:

I like how the diff in src/main.js is described in that way, but that info appears only when I merge, so my question is, what command should I use to see the same info about the diff but before doing merge?

看看 git merge 会说什么(假设你的 work-tree 是 "clean" 因为 git status 会说 "nothing to commit"),运行:

git diff --stat HEAD...HEAD@{upstream}

生成摘要的是 --stat。让我们暂时搁置 git diff 的争论;但请注意(因为这很重要)这假设一个简单的普通 single-merge-base-commit 合并,或一个 fast-forward 操作(这些很有可能)。

how do I check the files changed in after calling git fetch?

这个问题本身揭示了一些混乱(自然的混乱,因为 Git 非常混乱 :-))。具体来说,git fetch 没有更改任何文件。 git fetch 所做的是获得新的 提交 。每个提交都是一个快照——所有文件的副本,就像你制作快照时一样——而快照本身并不是一个 change.

同时,如果您查看带有 git showgit log -p 的快照,Git 将 显示 变化.如果快照是快照,而不是变更集,Git 怎么能显示 变更? 那么,经过一番思考,答案显而易见。就像其中之一 "spot the difference" pictures / quizzes:

  • 查看上一个快照。
  • 然后看这个快照。
  • 发生了什么变化?

这就是 git show 向您显示 change-set 的方式,即使提交是快照。该提交有一个 parent commit 并且 Git 只是与 git diff 进行比较,父 <em>hash</em> ~1<em>hash</em>^1,提交的哈希为 hash。 (~1^1 后缀在 Git 图中都后退了一个 first-parent。)

关于 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。这就是我们上面使用的。通常,three-dot 语法具有不同的含义; git diff 将其更改为这个特定的 "tell me what a merge would do" 意思,而不是。

(这不完全是 git merge 运行 在 after 完成合并后的结果,因为合并完成后,合并基础已经改变了。并且,如果合并基础不仅仅是单个提交,git diff A...B 语法无论如何都会选择一个单个提交,并比较这两个提交,而 git merge 将默认为更复杂的策略。因此,一个true-merge完成后,Git可以运行git diff --stat HEAD^ HEAD,这就是它的作用。对于fast-forwardnot-really-a-merge"merge",Git可以运行git diff --stat HEAD@{1} HEAD.)

有关 three-dot 表示法的正常和特殊 Git-diff-only 含义的更多信息,请参阅 the gitrevisions documentation and the git diff documentation