为什么需要git-pull来更新(不同的)分支(在没有git-pull的情况下将分支移动到最新提交)?

为什么需要git-pull来更新(不同的)分支(在没有git-pull的情况下将分支移动到最新提交)?,git,Git,我很乐意为这个问题写一个更精确的主题,但目前我无法表达得更好 基本上,假设你有一个回购协议,你有几个分支机构,比如说“master”和“mybranch” 那么,假设您在master上: $ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean 然后在这里执行git pull;为master分支和mybranch检索新提

我很乐意为这个问题写一个更精确的主题,但目前我无法表达得更好

基本上,假设你有一个回购协议,你有几个分支机构,比如说“master”和“mybranch”

那么,假设您在master上:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
然后在这里执行git pull;为
master
分支和
mybranch
检索新提交。由于您已经在分支
master
master
的头将由
git
自动更新为最新收到的提交

现在,假设您使用签出更改分支:

$ git checkout mybranch
Switched to branch 'mybranch'
Your branch is behind 'origin/mybranch' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
这就是让我困惑的地方——在上一次拉动中,(显然)所有最新的提交——包括
mybranch
中的提交——都被检索到了;否则我的本地git不会“知道”我的本地分支“落后于……2次提交”


所以我的问题是:既然我们已经下载了
mybranch
的新提交,为什么还要再次执行“git-pull”,到服务器进行不必要的往返?是否有一个“git update head”或某个命令可以在本地执行,而无需往返服务器?

您对第一步中发生的情况的解释是错误的。当您从
master
分支执行
git-pull
时,您实际上是在执行
git-pull-origin-master
。这将更新本地跟踪分支
origin/master
,然后将此分支合并到本地
master
中以快进它。它不影响其他分支

如果您只想进行一次到Git服务器的往返,那么您可以尝试执行以下操作:

git fetch origin   # update all local tracking branches
# from e.g. mybranch
git merge origin/mybranch
然后,如果您还想更新本地
主分支
分支,则只需签出并合并:

git checkout master
git merge origin/master
请注意,上述两个步骤完全在本地进行,与远程Git服务器无关。

图中缺少远程跟踪分支,这就是造成混淆的原因

(Remider:
git pull
是执行两个操作的便捷方式:
git fetch
然后
git merge origin/

当您
获取
时,您不是在修改本地分支,而是在更新作为远程分支镜像的远程跟踪分支

这些分支不由您签出或修改,它们用于比较或其他检查,如您所述

不过,
git pull
git fetch
更进一步,并将远程跟踪分支合并到其本地对应分支中


这解释了为什么您需要显式地更改分支,然后再次拉入(或简单地合并)以更新其他分支。

谢谢@TimBiegeleisen-这意味着,在OP示例中,如果我已经在
master
中执行了
git拉入操作(其中执行了
git抓取
git合并
)-我只要做一次git checkout mybranch
就可以了,对吗?是的,对
git pull
应该是相同的
git fetch
+
git merge
(除非您将rebase配置为默认的pull策略)。谢谢@RomainValeri-很好的解释(向上投票!),但是我接受了另一个答案,因为还有更多的命令行示例。@sdbbs不用担心,蒂姆的回答非常好,我们都在这个过程中学到了更多:-)