为什么需要 git pull 来更新(不同的)分支(将分支移动到没有 git pull 的最新提交)?
Why is git pull needed to update a (different) branch (moving branch to latest commit without git pull)?
我很乐意为这个问题写一个更精确的主题,但目前我无法更好地表达它。
基本上,假设您有一个仓库,其中有多个分支,例如 "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
的 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 不会 "know" 我的本地分支 "is behind ... by 2 commits".
所以我的问题是:当我们已经下载了 mybranch
的那些新提交时,为什么我还需要再次执行 "git pull",与服务器进行不必要的往返?难道没有 "git update-head" 或一些命令可以在本地执行,无需往返服务器?
您对第一步发生的事情的解释不正确。当您从 master
分支执行 git pull
时,您实际上是在执行 git pull origin master
。这会更新本地跟踪分支 origin/master
,然后将此分支合并到您本地 master
到 fast-forward 中。不影响其他分支。
如果您只想往返 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服务器。
您在图片中缺少 remote-tracking 个分支,这就是导致您混淆的原因。
(提醒:git pull
是进行两个操作的便捷方式:git fetch
然后 git merge origin/<currentBranch>
)
当您 fetch
时,您不是在修改本地分支,而是在更新 remote-tracking 分支,它们是远程分支的镜像。
您不能检查或修改这些分支,如您所述,它们用于比较或其他检查。
不过,git pull
比 git fetch
更进一步,将 remote-tracking 分支合并到它的本地分支中。
这解释了为什么您需要显式更改分支然后再次拉取(或简单地合并)以更新您的其他分支。
我很乐意为这个问题写一个更精确的主题,但目前我无法更好地表达它。
基本上,假设您有一个仓库,其中有多个分支,例如 "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
的 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 不会 "know" 我的本地分支 "is behind ... by 2 commits".
所以我的问题是:当我们已经下载了 mybranch
的那些新提交时,为什么我还需要再次执行 "git pull",与服务器进行不必要的往返?难道没有 "git update-head" 或一些命令可以在本地执行,无需往返服务器?
您对第一步发生的事情的解释不正确。当您从 master
分支执行 git pull
时,您实际上是在执行 git pull origin master
。这会更新本地跟踪分支 origin/master
,然后将此分支合并到您本地 master
到 fast-forward 中。不影响其他分支。
如果您只想往返 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服务器。
您在图片中缺少 remote-tracking 个分支,这就是导致您混淆的原因。
(提醒:git pull
是进行两个操作的便捷方式:git fetch
然后 git merge origin/<currentBranch>
)
当您 fetch
时,您不是在修改本地分支,而是在更新 remote-tracking 分支,它们是远程分支的镜像。
您不能检查或修改这些分支,如您所述,它们用于比较或其他检查。
不过,git pull
比 git fetch
更进一步,将 remote-tracking 分支合并到它的本地分支中。
这解释了为什么您需要显式更改分支然后再次拉取(或简单地合并)以更新您的其他分支。