首页 > 解决方案 > 分支是最新的,但拉取原点仍会导致更改

问题描述

如果我签出我的开发分支并git status收到消息:

Switched to branch development Your branch is up to date with origin/development

但是当我这样做时,git pull origin development它仍然会拉下新的变化。

为什么即使分支是最新的,新的更改也会被拉出?

标签: git

解决方案


您的分支与起源/开发是最新的

这种说法不能总是可信的。

只是将git status您的本地副本分支与相应的本地远程跟踪分支进行比较,而不是与驻留在服务器上的原始远程分支进行比较。

尽管本地远程跟踪分支应该与服务器上原始远程分支的状态相匹配,但它们受到一些限制。

仅当使用与网络相关的命令时,才会向前移动远程跟踪分支。

例如:

假设这是服务器上原始远程分支的当前状态。

   master
     |
A <- B

这是本地工作分支的状态和跟踪服务器上原始主分支的本地远程跟踪。

 remote/master
      |
 A <- B
      |
    master

现在假设,您做了一些新工作并提交该工作而不将其推送到服务器,所以这就是您的状态

服务器主机

   master
     |
A <- B

本地主机和本地远程/主机

 remote/master
      |
 A <- B <- C
           |
        master

如果您git status现在运行,git 将通过显示您比 master 提前 1 次提交来响应,因为它只是将您的本地 master 分支与您的本地远程/master 跟踪分支进行比较,而不是与服务器上的原始 master 分支进行比较。幸运的是,在这种情况下,远程/主服务器和服务器主服务器的状态完全相同,但情况并非总是如此。

假设在这种情况下,其他开发人员也将东西推送到服务器上相同的原始主分支。

因此,在另一位开发人员的这两个新推送之后,您在服务器上的原始主分支将如下所示,

服务器主机

             master
               |
A <- B <- D <- E

而且您是本地主分支,本地远程/主分支仍然具有相同的状态,就好像什么都没发生过一样。

 remote/master
      |
 A <- B <- C
           |
        master

远程/主分支根本没有移动。发生这种情况是因为只有在本地机器上执行任何与网络通信相关的命令时,git 才会将 remote/master 向前移动。由于您的机器没有进行网络调用,因此小远程/主服务器没有机会获取远程服务器主分支的状态,然后更改其状态。哑远程/master 仍然认为它与原始远程服务器 master 分支的状态是最新的。

如果您git status现在运行,git仍然会通过显示您仅比 master 提前 1 次提交来响应,我们知道情况并非如此。

你的情况就是这样,

当你被解雇git status时,git回复了

您的分支与起源/开发是最新的

因为它只是将您的本地开发分支与本地远程/开发分支进行了比较,但与此同时,有人已经将一些更改推送到服务器原始开发分支,因此当您这样做时,git pull它会将这些更改从服务器带给您并将它们合并到您的当地分支机构。


推荐阅读