当上游存在更改时,为什么git status显示分支是最新的?


226

跟踪分支的上游存在更改,但是当我键入git status时表明我的本地分支是最新的。这是新的行为吗,我是否更改了配置设置,还是出了点问题?

谢谢您的帮助。

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

Answers:


274

状态告诉您的是,您位于origin/master 本地ref中的ref后面。在这种情况下,ref碰巧跟踪了某个称为的远程分支中的分支origin,但状态并未告诉您有关该远程分支的任何信息。它告诉您有关ref的信息,ref只是存储在本地文件系统中的提交ID(在这种情况下,通常是在.git/refs/remotes/origin/master本地存储库中称为文件的文件中)。

git pull进行两次操作;首先,它执行a操作git fetch以使远程仓库中的提交保持最新(这将更新origin/master本地仓库中的引用),然后它执行a git merge来将那些提交合并到当前分支中。

直到您执行该fetch步骤(无论git pullgit status单独执行还是通过),您的本地存储库都无法知道上游还有其他提交,只能查看您的本地origin/master引用。

git status说“最新”时,它表示“当前分支所跟踪的分支的最新”,在这种情况下,其意思是“使用称为origin/master“ 的本地引用更新”。这仅相当于“上一次我们上次获取的上游状态fetch的最新状态”,与“最新上游状态的最新状态”不同。

为什么这样工作?好吧,这fetch是一个潜在的缓慢且昂贵的网络操作。Git(和其他分布式版本控制系统)的设计是为了避免不必要的网络操作,并且与许多人习惯的典型客户端-服务器系统完全不同(尽管如下文注释中所指出的,Git的概念)导致混乱的“远程跟踪分支”的名称并非所有DVCS都共享。完全可以脱机使用Git,而无需连接到集中式服务器,而的输出git status反映了这一点。

在Git中创建和切换分支(并检查其状态)应该是轻量级的,而不是对集中式系统执行缓慢的网络操作的东西。设计Git和git status输出时的假设是用户理解这一点(太多的Git功能只有在您已经知道Git的工作原理时才有意义)。随着很多不熟悉DVCS的用户采用Git,这种假设并不总是正确的。


79
最近的评论,但我遇到了同样的情况。我了解为什么git在获取之前无法了解更改。但是,它不应该说“最新”,这是不正确的。最好说“不知道远程会发生什么”。
Droidum '16

31
也许严格说来是合乎逻辑的,但这完全不符合人类的理性。您为什么不设计它来进行提取,然后声明它是否是最新的?还是更改消息以说明其实际作用,例如“您的分支在{timestamp}上次检查时是最新的'origin / master'”?甚至只是说:“进行提取以了解您的分支机构是否最新”?
科林

25
为什么不显示“您的分支是最新的”消息呢?我不知道要知道原点/主节点的状态,如果要代表原点远程上的实际主节点,则显然不知道。
whiterook6'6

2
@pastullo,因此创建一个别名。
Jonathan Wakely

23
这是Git可怕的可用性的完美示例。我喜欢它的强大功能和灵活性,但只是将消息更改为“您的分支是本地版本的'origin / master'的最新信息。” 将会是一个巨大的进步。这里的困惑是跟踪一个远程分支的本地分支起源/主节点(与您使用的任何远程/分支模式匹配)。
matthewcummings516

35

这是因为您的本地存储库尚未通过上游遥控器签入。要按照您的期望进行这项工作,请使用,git fetch然后git status再次运行。


7

虽然这些都是可行的答案,但我还是决定提供一种方法来检查本地存储库是否与远程存储(无论是获取还是提取)一致。为了查看我的分支在哪里,我简单地使用:

git remote show origin

它的作用是返回所有当前跟踪的分支,最重要的是-信息是否是最新的,位于远程起源分支之前还是之后。在上面的命令之后,这是返回的示例:

  * remote origin
  Fetch URL: https://github.com/xxxx/xxxx.git
  Push  URL: https://github.com/xxxx/xxxx.git
  HEAD branch: master
  Remote branches:
    master      tracked
    no-payments tracked
  Local branches configured for 'git pull':
    master      merges with remote master
    no-payments merges with remote no-payments
  Local refs configured for 'git push':
    master      pushes to master      (local out of date)
    no-payments pushes to no-payments (local out of date)

希望这对某人有帮助。


0

“源/主”是指向分支“源/主”的HEAD提交的引用。引用是对Git对象(通常是提交对象)的友好别名。仅当您git push访问远程服务器时,“源/主服务器”参考才会更新(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

1
您不应该在.git目录中放置项目,它不适用于打包的引用。您描述的获取行为也适用于旧版本的git。
Andrew C

不会在origin/master裁判还得到一个更新的获取,以及推?
Jonathan Wakely,2015年

正确。到目前为止,我一直在使用Git 1.8.3。我确实注意到,在2.2.1版中,FETCH_HEAD在获取期间也会更新。同样,当出现消息“您的分支是最新的...”或“您的分支落后于...到X提交”时,仅当您的本地分支跟踪给定的远程分支时,该消息才会显示。为了使master能够跟踪原点/母版,必须从分支master上运行git branch -u origin / master。如果没有跟踪,则仍然需要运行git diff。
Marek Stanley

好吧,我建议您更正以下说法:“将“ git / master”引用仅在您将git push到您的遥控器时才会更新”
Jonathan Wakely 2015年

0

让我们寻找到一个样品混帐回购协议,以验证是否your branch (master)up to dateorigin/master

验证本地主机正在跟踪源/主机:

$ git branch -vv
* master a357df1eb [origin/master] This is a commit message

有关本地主分支的更多信息:

$ git show --summary
commit a357df1eb941beb5cac3601153f063dae7faf5a8 (HEAD -> master, tag: 2.8.0, origin/master, origin/HEAD)
Author: ...
Date:   Tue Dec 11 14:25:52 2018 +0100

    Another commit message

验证源/主服务器是否在同一提交上:

$ cat .git/packed-refs | grep origin/master
a357df1eb941beb5cac3601153f063dae7faf5a8 refs/remotes/origin/master

我们可以看到相同的哈希值,可以肯定地说,至少在当前的git repo中,该分支与远程分支是一致的。



0

琐碎的回答在某些情况下却很准确,例如把我带到这里的那个。我在一个对我来说是新的仓库中工作,我添加了一个状态不被视为新文件。

最终该文件与.gitignore文件中的模式匹配。


0

在这种情况下,使用git add并集成所有待处理文件,然后使用git commit和git push

git add-集成所有pedent文件

git commit-保存提交

git push-保存到存储库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.