为什么git status show branch在上游存在变化时是最新的?

跟踪分支上游存在更改,但是当键入git status ,表明我的本地分支是最新的。 这是新的行为,我改变了一个configuration设置,或者是错的?

谢谢您的帮助。

 ubuntu@host:/my/repo# git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean ubuntu@host:/my/repo# git pull remote: Counting objects: 11, done. remote: Compressing objects: 100% (11/11), done. remote: Total 11 (delta 6), reused 0 (delta 0) Unpacking objects: 100% (11/11), done. From bitbucket.org:my/repo 1234567..abcdefg master -> origin/master Updating 1234567..abcdefg Fast-forward file1 | 1 - file2 | 43 +++++++++++++++++++++++++++++++++++++++++++ file3 | 21 ++++++++++++--------- file4 | 21 ++++++++++++--------- 4 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 file5 

什么状态告诉你,你是在你的本地回购当地ref ref origin/master后面。 在这种情况下,ref恰好跟踪某个远程被调用的origin的分支,但状态不会告诉你有关远程分支的任何信息。 它告诉你关于ref的信息,它只是存储在本地文件系统中的一个提交ID(在这种情况下,它通常位于本地仓库中的.git/refs/remotes/origin/master中)。

git pull做了两个操作; 首先它执行git fetch以获得最新的远程仓库中的提交(更新你的本地仓库中的origin/master ref),然后执行git merge ,将这些提交git merge到当前分支中。

直到你执行fetch步骤(无论是自己的还是通过git pull ),你的本地回购没有办法知道上游有额外的提交,并且git status只查看你本地的origin/master ref。

git status表示最新时,意味着“当前分支跟踪的分支是最新的”,在这种情况下,它意味着“最新的本地裁判称为origin/master ”。 这只相当于“上一次检索到的上游状态的最新状态”,与“上游最新的活动状态的最新状态”不一样。

为什么这样工作? 那么fetch步骤是一个潜在的缓慢和昂贵的networking操作。 Git(和其他分布式版本控制系统 )的devise是为了在不需要的时候避免networking操作,而且是与许多人习惯的典型客户机 – 服务器系统完全不同的模型。 完全可以使用Git离线,没有连接到中央服务器, git status的输出反映了这一点。

在Git中创build和切换分支(并检查其状态)应该是轻量级的,而不是对集中式系统执行缓慢的networking操作。 deviseGit和git status输出的假设是用户明白这一点。 由于许多不熟悉DVCS的用户采用Git,这种假设并不总是有效的。

这是因为您的本地回购没有与上游遥控器签入。 为了让这个工作正如你所期望的那样,使用git fetch然后再次运行一个git status

“origin / master”是指引用到分支“origin / master”的HEAD提交的引用。 引用是一个Git对象的人性化别名,通常是一个提交对象。 当您将git push送到您的远程时,“origin / master”引用只会被更新( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes )。

从项目的根目录中,运行:

 cat .git/refs/remotes/origin/master 

将显示的提交ID与:

 cat .git/refs/heads/master 

他们应该是一样的,这就是为什么Git说master是最新的origin/master

当你跑步

 git fetch origin master 

这将在.git / objects文件夹下本地检索新的Git对象。 而且Git更新.git / FETCH_HEAD,现在它指向提取分支的最新提交。

因此,要查看当前本地分支和从上游获取的分支之间的差异,可以运行

 git diff HEAD FETCH_HEAD