Git:究竟是什么导致远程分支更新?

时间:2013-07-17 13:31:33

标签: git remote-branch

根据Pro Git(3.5):

[remote branches are] local branches that you can’t move; they’re moved     
automatically whenever you do any network communication.

然而,这在实践中似乎并不正确。我到达的情况是

 Your branch is ahead of 'origin/branch-x' by 23 commits.

但我实际上还没有完成任何提交,只是获取/撤消了其他人推动的修改。 如果Pro Git的陈述是正确的,我希望我的远程分支与我的本地远程分支相同,因为每次获取或拉取都是与源的通信。

更新远程分支的确切操作是什么?

2 个答案:

答案 0 :(得分:2)

我怀疑你的问题可能源于一种特殊的扭曲git pull的语义 - 让我们引用git pull手册:

  

也支持一些捷径符号   ...
  参数< ref>没有冒号等同于< ref>:拉/取时,所以它合并< ref>进入当前分支而不将远程分支存储在本地任何地方

这意味着当你做

git pull

git pull origin

(依赖于branch.<name>.remotebranch.<name>.merge - 在后一种情况下 - 配置变量)然后获取远程repo所拥有的所有分支,并相应地更新本地存储库中的远程分支

但是当你做git pull origin branch-x时,repo“origin”中分支“branch-x”的对象被提取 1 没有更新远程分支您的本地仓库然后将提取的提示对象合并到当前已检出的分支中。

因此,要修复您的情况,请运行git fetch origin并更新远程分支。 您可能需要考虑阅读this blog post,以便更好地了解为什么git pull在所有可能的情况下与git fetch + git merge不完全等效。

修复origin/branch-x远程分支情况的另一种方法是git push origin branch-x假设您的本地branch-x设置为跟踪origin/branch-x - 这种情况发生的原因是当您推送时一个跟踪分支Git知道远程仓库中的接收分支现在看起来就像你刚推动的分支一样,所以更新匹配的远程分支是一件很明智的事情。 如果您对这些概念感到不舒服(远程分支与跟踪分支),请从阅读this part of The Book开始。


1 好吧,实际上只提取本地存储库中缺少的对象。

答案 1 :(得分:1)

就像书中所说,只要git进行任何网络操作,它们就会自动移动。这包括git fetchgit pushgit pull

  

如果Pro Git的陈述是正确的,我希望我的远程分支与我的本地远程分支相同,因为每次获取或拉取都是与原点的通信。

我认为你对“自动移动”的含义感到有点困惑。移动远程分支时,会移动它们以反映远程存储库的当前状态。 git fetchgit pull不会更改远程存储库本身,因此远程分支也不会移动。

尝试运行git log --oneline --graph --decorate以查看存储库当前状态的精美图表。请注意该图表中branch-xorigin/branch-x的位置。然后,运行git push将更改推送到远程存储库。然后再次运行git log --oneline --graph --decorate;你会看到origin/branch-x已经移动了。这就是您引用的引用中的含义。