如果两个人在 github 上的同一个仓库和同一个分支 master 上工作。然后假设 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
中的差异,但该信息仅在我 merge 时出现,所以我的问题是,我应该使用什么命令来查看相同的内容有关差异的信息但在 merge 之前?
最佳答案
在我回答之前,请先注意一下:
git merge master origin/master
请不要这样做:您只需要 git merge origin/master
, 不是 git merge master origin/master
. (幸运的是,当你运行这个时你在 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
会说(假设你的工作树是“干净的” git status
会说“没有什么可提交的”),运行:
git diff --stat HEAD...HEAD@{upstream}
这是--stat
产生摘要。让我们暂时搁置一下 git diff
的论点。这里;但请注意(因为这很重要)这假定了一个简单的、普通的单 merge 基础提交 merge ,或快进操作(这些很有可能)。
how do I check the files changed in after calling
git fetch
?
这个问题本身揭示了一些困惑(自然的困惑,因为 Git 非常困惑:-))。具体来说, git fetch
没有更改任何文件。 什么 git fetch
所做的是获得新的提交。每次提交都是一个快照——所有文件在您创建快照时的副本——而快照本身并不是更改。
与此同时,如果您查看带有 git show
的快照或 git log -p
, Git 将显示 更改。如果快照是快照,而不是变更集,Git 如何显示变更?好吧,经过一番思考,答案显而易见。就像其中之一 "spot the difference" pictures / quizzes :
- 查看上一个快照。
- 然后查看这个快照。
- 发生了什么变化?
就是这样git show
向您显示一个变更集,即使提交是一个快照。该提交有一个 parent 提交,Git 只是比较,与 git diff
, parent <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
命令不同:它只查看那两个 提交。实际上,它丢弃了 ..
。部分(当然,除了它们用于分隔两个名称)。
说到 merge ,还有一个特别的git diff
语法:git diff A...B
表示 git diff $(git merge-base A B) B
.这就是我们上面使用的。通常,三点语法具有不同的含义; git diff
改为将其更改为这个特定的“告诉我 merge 会做什么”的意思。
(这不完全是 git merge
在完成 merge 后 最后运行的内容,因为在 merge 完成后, merge 基础已经改变。而且,如果 merge 基础不仅仅是对于单个提交,git diff A...B
语法无论如何都会选择一个提交,并比较这两个提交,而 git merge
将默认采用更复杂的策略。因此, 真正 merge 完成后, Git 可以运行 git diff --stat HEAD^ HEAD
,这基本上就是它所做的。对于快进的非真正 merge “merge ”,Git 可以运行 git diff --stat HEAD@{1} HEAD
。)
有关三点表示法的正常和特殊 Git-diff-only 含义的更多信息,请参阅 the gitrevisions documentation和 the git diff
documentation .
关于git - 如何在调用 git fetch 后查看更改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49199751/