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

标签 git git-merge git-fetch

如果两个人在 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 documentationthe git diff documentation .

关于git - 如何在调用 git fetch 后查看更改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49199751/

相关文章:

android - 如何自动在apk文件名中包含git分支名称

java - 在 Java 中,如何创建一个重用 Git 存储库的线程安全应用程序?

git - 默认的 git divergent merge 策略是什么?

Git - 如何有选择地将更改从一个分支应用到另一个分支?

git - git-pull 如何与 git-fetch 结合使用(是 : what does git-pull option `-p` mean)?

git - 让 Git 不跟踪所有分支

GIT pull error - 远程对象已损坏

ios - Pod Install 无权访问私有(private) repo,但 git clone 等在同一个 repo 上工作

git - 让 git 只是*复制*(而不是 merge )?

python - 如何从源代码使用 pbr 版本?