【问题标题】:How to see changed files after calling git fetch调用 git fetch 后如何查看更改的文件
【发布时间】:2018-08-18 09:05:38
【问题描述】:

如果两个人在 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 中的差异以这种方式描述,但该信息仅在我合并时出现,所以我的问题是,我应该使用什么命令来查看关于差异的相同信息但在合并之前?

【问题讨论】:

    标签: git git-merge git-fetch


    【解决方案1】:

    此命令将帮助您:

    git diff master:src/main.js
    

    看起来这个问题部分被这个话题重复了:

    git: diff between file in local repo and origin

    【讨论】:

    • 不是这样的。在我获取之后,我想查看差异......因为您的代码git diff master:src/main.js 暗示我必须了解 src/main.js 但我不知道。我只是在获取,那时我无法知道哪些文件被修改了,所以我需要知道在获取之后
    【解决方案2】:

    获取之后你想做的事:

    git diff ..origin/master
    

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

    【讨论】:

      【解决方案3】:

      如果您知道自己触摸了哪些文件,您也可以尝试快速查看:

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

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

      git diff master:src/main.js
      

      【讨论】:

        【解决方案4】:

        在我完全回答之前,请注意:

        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 showgit 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 documentationthe git diff documentation

        【讨论】:

          猜你喜欢
          • 2017-01-15
          • 2015-06-02
          • 1970-01-01
          • 2018-05-20
          • 2015-10-05
          • 2020-02-11
          • 2011-12-24
          • 2010-09-15
          相关资源
          最近更新 更多