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

时间:2019-07-08 10:15:36

标签: git

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

基本上,假设您有一个仓库,其中有多个分支,例如“ master”和“ mybranch”。

所以,假设您是一位高手:

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

nothing to commit, working tree clean

然后您在此处进行git pullmaster分支和mybranch都检索到新的提交。由于您已经在分支master中,因此master的HEAD由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”或某些命令可以在本地完成,而无需往返服务器?

2 个答案:

答案 0 :(得分:4)

您在图片中缺少远程跟踪分支,这就是造成您困惑的原因。

(Remider:git pull是执行两项操作的便捷方式:先依次是git fetchgit merge origin/<currentBranch>

fetch并不是在修改本地分支,而是在更新远程跟踪分支,它们是远程分支的镜像。

这些分支不能由您检出或修改,它们用于比较或其他检查的目的。

git pullgit fetch前进了一步,并将远程跟踪分支合并到其本地副本中。

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

答案 1 :(得分:3)

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

如果您只想往返于Git服务器,则可以尝试执行以下操作:

git fetch origin   # update all local tracking branches
# from e.g. mybranch
git merge origin/mybranch

然后,如果您还想更新本地master分支,则只需签出并合并:

git checkout master
git merge origin/master

请注意,以上两个步骤完全在本地进行,独立于远程Git服务器。