1

根据 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 的陈述是正确的,我希望我的远程分支与我的本地分支相同,因为每次获取或拉取都将是与源的通信。

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

4

2 回答 2

3

我怀疑您的问题可能源于git pull其语义上的特殊转折——让我们引用git pull手册:

还支持一些快捷表示法。
...
不带冒号的参数 <ref> 等效于 <ref>: 在拉取/获取时,因此它会将 <ref> 合并到当前分支中,而不会将远程分支存储在本地任何地方

这意味着当你做

git pull

或者

git pull origin

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

但是当你这样做时git pull origin branch-x,repo "origin" 中的分支 "branch-x" 的对象被获取1本地 repo 中没有远程分支被更新,然后获取的 tip 对象被合并到当前签出的分支中.

因此,要解决您的情况,只需运行git fetch origin并更新您的远程分支。您可能需要考虑阅读这篇博文,以更好地了解为什么在所有可能的情况下git pull不完全等同于git fetch+ 。git merge

解决origin/branch-x远程分支情况的另一种方法是git push origin branch-x假设您的本地branch-x设置为跟踪origin/branch-x- 这是因为当您推送跟踪分支时,Git 知道远程仓库中的接收分支现在看起来与您刚刚推送的分支完全一样因此更新匹配的远程分支是一件明智的事情。如果您对这些概念(远程分支与跟踪分支)不满意,请从阅读本书的这一部分开始。


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

于 2013-07-17T15:07:46.453 回答
1

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

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

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

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

于 2013-07-17T13:51:32.240 回答